Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Мессенджер Наизнанку

Max Sokolov
November 11, 2017

Мессенджер Наизнанку

Max Sokolov

November 11, 2017
Tweet

Other Decks in Programming

Transcript

  1. Не все сценарии можно реализовать 
 (статусы доставки / прочтения,

    черный список)* Нет контроля над перепиской 
 (пре-обработка / спам)* Минусы Backend as a Service 18
  2. 1 x App Backend в разработке 1 x App Конец

    2015 HTTP Середина 2015 BaaS Эволюция Мессенджера 20
  3. Задержки
 (Polling / Long polling - стратегия обновлений) Лишний трафик,

    накладно делать некоторые сценарии*
 (http заголовки + хендшейки на соединение*) Лишние запросы
 (новых событий может не быть) HTTP Минусы 21
  4. 1 x App 1 x App Конец 2015 HTTP Середина

    2015 BaaS 4 x App Конец 2016 Web Socket Backend в разработке Эволюция Мессенджера 22
  5. SEND MSG NOTIF MSG-ID RESP MSG-ID DEVICE-1 SOCKET CONNECTION 30

    DEVICE-2 SOCKET CONNECTION ОДИН ПОЛЬЗОВАТЕЛЬ - МНОГО СЕССИЙ NOTIF MSG-ID
  6. Добавить в тело сообщения random id, 
 назначенный на клиенте

    Обрабатывать нотификации после того,
 как получены все ответы к запросам Решения Дублирование сообщений 31
  7. Коды ошибок при разрыве 
 (401 / рефреш токена) Очередь

    на запросы к серверу 
 (assert на превышение) Обработка ошибок 36
  8. final class MessengerResponseMapperImpl { func map<T: MessengerResponseMappable>( responseData: Data, completion:

    @escaping (_ result: Result<T>) -> ()) { } } 44 protocol MessengerResponseMappable: class { static func map(_ dictionary: [String: String]) -> Self? } let dictionary = jsonParser.parse(data: responseData) let value = T.map(dictionary) completion(.value(value))
  9. extension MessengerResponseMappable where Self: Unboxable { static func map(_ dictionary:

    [String: String]) -> Self? { return try? unbox(dictionary: dictionary) } } 45
  10. open class MessengerClient { /* Inject: Network transport Request serializer

    Response serializer */ func getChats<T: MessengerResponseMappable>( completion: @escaping (_ result: Result<[T]>) -> Void) { } } 48
  11. CHAT LIST SERVICE USERS ONLINE STATUS SERVICE MESSAGES STATUS SERVICE

    NEW MESSAGE SERVICE BLACK LIST SERVICE DELETE CHAT SERVICE REACHABILITY SERVICE 58
  12. // MARK: - state private var chats: [Chat] { }

    func subscribeOnUpdates() { usersOnlineStatusServiceObservable.add( observer: self, onUsersOnlineStatusChange: { users in // update chats } )
 } 65 didSet { notifyObservers() } newMessagesServiceObservable.add( observer: self, onNewMessage: { newMessage in // update chats } )
  13. CHAT LIST SERVICE OBSERVABLE USERS ONLINE STATUS SERVICE MESSAGES STATUS

    SERVICE NEW MESSAGE SERVICE BLACK LIST SERVICE DELETE CHAT SERVICE REACHABILITY SERVICE OBSERVABLE OBSERVABLE OBSERVABLE OBSERVABLE OBSERVABLE OBSERVABLE 66
  14. Sample Operator Emit the most recent items emitted by an

    Observable within periodic time intervals 74
  15. final class ChatListViewController: UIViewController { func processOnChatListUpdates(_ chats: [ChatViewData]) {

    } } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) invokeClosuresHelper.setViewIsReady(true) } 79 invokeClosuresHelper.invokeOrDelayIfViewIsNotReady { // do ui updates... }
  16. Diff алгоритм ITEM 3 ITEM 4 ITEM 2 ITEM 1

    ITEM 5 ITEM 4 ITEM 6 ITEM 5 ITEM 2 ITEM 7 RELOADS INSERTS DELETES 81
  17. Выбирайте инструмент под задачу Выносите логику работы c API
 в

    отдельный модуль Закладывайте масштабируемость Общайтесь с коллегами из других платформ Выводы 82