"Подходы, используемые в разработке ios-клиента...
TRANSCRIPT
![Page 1: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/1.jpg)
Подходы, используемые в разработке iOS-
клиента ViberКирилл Лашкевич
![Page 2: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/2.jpg)
Кратко о Viber iOS• 6 лет разработки
• ~1M SLOC
• Команда iOS: 20 человек в 4 странах и 5 городах
• 6 языков программирования
![Page 3: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/3.jpg)
Археология программирования
![Page 4: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/4.jpg)
6 языков
![Page 5: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/5.jpg)
6 языков• ASM
• C
• C++
![Page 6: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/6.jpg)
6 языков• ASM
• C
• C++
• ObjC
• ObjC++
• Swift
![Page 7: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/7.jpg)
Используем фреймворки и инструменты на пределе
возможностей• CoreData
• Xcode
• clang
• Git
• Hardware
![Page 8: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/8.jpg)
![Page 9: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/9.jpg)
🎤
![Page 10: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/10.jpg)
🎤 Encode
![Page 11: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/11.jpg)
🎤 Encode Packetize
![Page 12: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/12.jpg)
🎤 Encode Packetize Send
![Page 13: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/13.jpg)
🎤 Encode Packetize Send
![Page 14: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/14.jpg)
🎤 Encode Packetize Send
NAT�Traversal
![Page 15: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/15.jpg)
🎤 Encode Packetize Send
Receive
NAT�Traversal
![Page 16: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/16.jpg)
🎤 Encode Packetize Send
ReceiveDepacketize
NAT�Traversal
![Page 17: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/17.jpg)
🎤 Encode Packetize Send
ReceiveDepacketizeDecode
NAT�Traversal
![Page 18: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/18.jpg)
🔊
🎤 Encode Packetize Send
ReceiveDepacketizeDecode
NAT�Traversal
![Page 19: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/19.jpg)
🔊
📺
🎥🎤 Encode Packetize Send
ReceiveDepacketizeDecode
Encode Packetize Send
ReceiveDepacketizeDecode
NAT�Traversal
![Page 20: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/20.jpg)
🔊
📺
🎥🎤 Encode Packetize Send
ReceiveDepacketizeDecode
Encode Packetize Send
ReceiveDepacketizeDecode
NAT�Traversal
sync
![Page 21: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/21.jpg)
🔊
📺
🎥🎤 Encode Packetize Send
ReceiveDepacketizeDecode
Encode Packetize Send
ReceiveDepacketizeDecode
NAT�Traversal
sync sync
![Page 22: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/22.jpg)
🔊
📺
🎥🎤 Encode Packetize Send
ReceiveDepacketizeDecode
Encode Packetize Send
ReceiveDepacketizeDecode
NAT�Traversal
sync sync
sync
![Page 23: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/23.jpg)
🔊
📺
🎥🎤 Encode Packetize Send
ReceiveDepacketizeDecode
Encode Packetize Send
ReceiveDepacketizeDecode
NAT�Traversal
sync sync
sync
Capability�Negotiation
![Page 24: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/24.jpg)
🔊
📺
🎥🎤 Encode Packetize Send
ReceiveDepacketizeDecode
Encode Packetize Send
ReceiveDepacketizeDecode
NAT�Traversal
sync sync
sync
Capability�NegotiationAEC
![Page 25: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/25.jpg)
🔊
📺
🎥🎤 Encode Packetize Send
ReceiveDepacketizeDecode
Encode Packetize Send
ReceiveDepacketizeDecode
NAT�Traversal
sync sync
sync
Capability�NegotiationAEC
BitrateControl
![Page 26: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/26.jpg)
🔊
📺
🎥🎤 Encode Packetize Send
ReceiveDepacketizeDecode
Encode Packetize Send
ReceiveDepacketizeDecode
NAT�Traversal
sync sync
sync
Capability�NegotiationAEC
BitrateControl
FEC
![Page 27: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/27.jpg)
![Page 28: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/28.jpg)
Git
• ~120 комиков в неделю
• 32k всего
• 10k мержей
• неизвестное количество веток
• 15 прилинкованных внешних origins
![Page 29: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/29.jpg)
Управление внешними зависимостями
• CocoaPods, Carthage • git submodules • git subtrees
![Page 30: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/30.jpg)
Управление внешними зависимостями
• CocoaPods, Carthage • git submodules • git subtrees
![Page 31: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/31.jpg)
LibViber
Core
Media�Engine
Codec Codec
Viber�iOS
DSP
RAC Mantle
![Page 32: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/32.jpg)
LibViber
Core
Media�Engine
Codec Codec
Viber�iOS
DSP
RAC Mantle
![Page 33: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/33.jpg)
LibViber
Core
Media�Engine
Codec Codec
Viber�iOS
DSP
RAC Mantle
![Page 34: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/34.jpg)
LibViber
Core
Media�Engine
Codec Codec
Viber�iOS
DSP
RAC Mantle
![Page 35: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/35.jpg)
LibViber
Core
Media�Engine
Codec Codec
Viber�iOS
DSP
RAC Mantle
![Page 36: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/36.jpg)
LibViber
Core
Media�Engine
Codec Codec
Viber�iOS
DSP
RAC Mantle
![Page 37: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/37.jpg)
LibViber
Core
Media�Engine
Codec Codec
Viber�iOS
DSP
RAC Mantle
![Page 38: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/38.jpg)
LibViber
Core
Media�Engine
Codec Codec
Viber�iOS
DSP
RAC Mantle
![Page 39: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/39.jpg)
LibViber
Core
Media�Engine
Codec Codec
Viber�iOS
DSP
RAC Mantle
![Page 40: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/40.jpg)
Git submodulesgit pull … && git submodule update --recursive
git status, --git-dir, --work-tree, git archive игнорируют сабмодули
git worktree игнорируют сабмодули
Разграничение доступа к репозиториям
Кроссплатформенный подход
![Page 41: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/41.jpg)
LibViber
Core
Media�Engine
Codec Codec
Viber�iOS
DSP
RAC Mantle
![Page 42: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/42.jpg)
LibViber
Core
Media�Engine
Codec Codec
Viber�iOS
DSP
RAC Mantle
![Page 43: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/43.jpg)
Сборка
![Page 44: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/44.jpg)
Сборка
![Page 45: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/45.jpg)
Сборка
• cmake, scons, GYP, qmake
![Page 46: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/46.jpg)
Сборка
• cmake, scons, GYP, qmake
• Xcode, xcodebuild
![Page 47: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/47.jpg)
Сборка
• cmake, scons, GYP, qmake
• Xcode, xcodebuild
• Workspace, project, target
![Page 48: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/48.jpg)
Сборка
• cmake, scons, GYP, qmake
• Xcode, xcodebuild
• Workspace, project, target
• External build, Run Script
![Page 49: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/49.jpg)
1 Project 1 Target
![Page 50: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/50.jpg)
1 Project N Targets
![Page 51: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/51.jpg)
1 Project N Subprojects
![Page 52: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/52.jpg)
1 Workspace N Projects
![Page 53: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/53.jpg)
+ external build
+ external build
![Page 54: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/54.jpg)
![Page 55: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/55.jpg)
Проблемы Xcode
• Не все возможности документированы
• Сборка специфических файлов под разные архитектуры (armv7/arm64)
• Скорость сборки
![Page 56: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/56.jpg)
Swift
![Page 57: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/57.jpg)
Swift• Мы используем Swift!
![Page 58: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/58.jpg)
Swift• Мы используем Swift!
• 15-строчный скрипт для генерации иконки с версией сборки
![Page 59: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/59.jpg)
CoreData
![Page 60: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/60.jpg)
CoreDataПоучительная история
![Page 61: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/61.jpg)
CoreDataПоучительная история
Many-To-Many
![Page 62: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/62.jpg)
CoreDataПоучительная история
Many-To-Many
+Core data migration
![Page 63: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/63.jpg)
ReactiveCocoa✓Замена KVO
✓Элементы функционального программирования в ObjC
✓Меньше изменяемого состояния -> меньше багов
- Крутая кривая обучения
- Слишком много блоков в коде
![Page 64: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/64.jpg)
–Alex A, iOS team lead
“Зачем мы засунули RAC и не можем высунуть?”
![Page 65: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/65.jpg)
![Page 66: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/66.jpg)
RAC(self, label.text) = RACObserve(self, name);
![Page 67: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/67.jpg)
RAC(self, label.text) = RACObserve(self, name);
http://www.raywenderlich.com/62796/reactivecocoa-tutorial-pt1
![Page 68: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/68.jpg)
[[[[[[[self requestAccessToTwitterSignal] then:^RACSignal *{ @strongify(self) return self.searchText.rac_textSignal; }] filter:^BOOL(NSString *text) { @strongify(self) return [self isValidSearchText:text]; }] throttle:0.5] flattenMap:^RACStream *(NSString *text) { @strongify(self) return [self signalForSearchWithText:text]; }] deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDictionary *jsonSearchResult) { NSArray *tweets = [jsonSearchResult[@"statuses"] .rac_sequence map:^(id tweet) { return [RWTweet tweetWithStatus:tweet]; }].array; [self.resultsViewController displayTweets:tweets]; } error:^(NSError *error) { NSLog(@"An error occurred: %@", error); }];
![Page 69: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/69.jpg)
[[[[[[[self requestAccessToTwitterSignal] then:^RACSignal *{ @strongify(self) return self.searchText.rac_textSignal; }] filter:^BOOL(NSString *text) { @strongify(self) return [self isValidSearchText:text]; }] throttle:0.5] flattenMap:^RACStream *(NSString *text) { @strongify(self) return [self signalForSearchWithText:text]; }] deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDictionary *jsonSearchResult) { NSArray *tweets = [jsonSearchResult[@"statuses"] .rac_sequence map:^(id tweet) { return [RWTweet tweetWithStatus:tweet]; }].array; [self.resultsViewController displayTweets:tweets]; } error:^(NSError *error) { NSLog(@"An error occurred: %@", error); }];
![Page 70: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/70.jpg)
Проблемы с self в ObjC
• self захватывается по сильной ссылке
• Доступ к _ivar происходит через неявный self ^ { NSLog(@"%@", _ivar); }; ^ { NSLog(@"%@", self->_ivar); };
• Как результат циклическая ссылка если блок сохранился как в поле объекта
![Page 71: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/71.jpg)
@weakself
https://habrahabr.ru/company/viber/blog/232185/
![Page 72: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/72.jpg)
@weakself• Безопасное использование self в блоках: слабая ссылка пока блок не вызван и сильная во время вызова
• self называется self
• Проверка в рантайме на доступ к _ivar в блоках через неявный self
https://habrahabr.ru/company/viber/blog/232185/
![Page 73: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/73.jpg)
[RACObserve(self, pttState) doNext: @weakselfnotnil(^(NSNumber *state)) { self.isRecording = !!state.intValue; } @weakselfend];
![Page 74: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/74.jpg)
[RACObserve(self, pttState) doNext: @weakselfnotnil(^(NSNumber *state)) { self.isRecording = !!state.intValue; } @weakselfend];
![Page 75: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/75.jpg)
[RACObserve(self, pttState) doNext: @weakselfnotnil(^(NSNumber *state)) { self.isRecording = !!state.intValue; } @weakselfend];
1628 блоков в проекте используют weakself
![Page 76: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/76.jpg)
CrashlyticsПросто используйте её, она клевая
![Page 77: "Подходы, используемые в разработке iOS-клиента Viber" Кирилл Лашкевич (Viber)](https://reader033.vdocuments.pub/reader033/viewer/2022042520/587cdd851a28abff0b8b60bf/html5/thumbnails/77.jpg)
@notorca