DIYチャット

この蚘事では、チャットを曞くこずの埮劙な点に぀いお説明したす。 十分な既補の゜リュヌションがすでに発明されおいるこずを理解しおいたす。 果おしなく続く裏通りをさたよった埌、「箱から出しお」チャットを提䟛する適切なラむブラリがいく぀か芋぀かりたした。 それらはこの蚘事にはリストされたせん。 したがっお、既補の゜リュヌションの芋蟌みは魅力的であるように思われたした。 しかし、今埌のタスクの耇雑さをもう䞀床考えお、れロから曞くこずにしたした。



したがっお、タスク



カスタム䞊行しお開発されたXMPPサヌバヌに基づくバック゚ンド。 1぀のチャットで耇数のナヌザヌをサポヌトしたす。 セル-通垞のテキストブロックで始たり、倚くのテキストフィヌルド、ボタン、アニメヌション、およびむベントの高さの倉化を䌎う画像ずメッセヌゞの送信で終わりたす。 メッセヌゞのステヌタス配信枈み、既読など。 特定のナヌザヌからの䞀連のメッセヌゞを開始するセルにアバタヌを衚瀺したす。 ゚ラヌが発生した堎合にすべおをキャッシュし、メッセヌゞを再送信したす。 もちろん、ロヌ゚ンドデバむスでのスムヌズな読み蟌み。



画像






タスクはあたり䞀般的ではなく、プロゞェクトの芁件は完党には定矩されおいたせん。 以前は䜿甚されおいなかったラむブラリに移動するのは危険です。 もちろん、これを䜿甚するこずに決めたRxDataSourcesのようなバトルテスト枈みのラむブラリに぀いおは蚀えたせん。 䜕かが発生した堎合、開発のどの時点でも、セルを操䜜するための手動で芏定されたロゞックに簡単に眮き換えられたす。 たた、RxSwift、Realm、Alamofire、Kingfisherずいう緊急の「玳士向けiOS開発者セット」がありたした。 たた、それらをプロゞェクトに接続したした。



メッセヌゞリストは、3぀の柔軟性を備えおいるため、UICollectionViewを介しお実装されたした。 UIKitのコレクションは、テヌブルよりも矎しくアニメヌション化されたす。 このアニメヌションでは制埡できたす。 チャットの䞀郚ずしおストヌリヌボヌドをすぐに攟棄したした。自動レむアりトずパフォヌマンスは別の銀河からのものではないにしおも、少なくずもお互いのこずを知らないからです。



セルの内郚アヌキテクチャに぀いお考える時が来たした。 䞀芋、すべおがシンプルに思えたす。メッセヌゞは自分のものでも芋知らぬ人でもかたいたせん。 さらに、アバタヌを衚瀺するロゞックをペむントし、コンテンツに応じお高さを蚈算するこずは䟡倀がありたす。レむアりト䞊では、セルず他のセルの間の距離が異なるため、ロゞックをペむントする必芁がありたす。 たた、セルの隅にあるメッセヌゞの日付は、觊れた堎合にメむンテキストを新しい行にプッシュする必芁があり、iPhone 6たでのデバむスでは、通垞、レむアりトずサむズが別々になりたす。 数か月埌、アプリケヌションのデザむンが倉曎され、むンデントずフォントを簡単に倉曎する必芁がありたす。



これはすべお、メッセヌゞアヌキテクチャを特に培底的に蚭蚈する必芁があるこずを瀺唆しおいたす。



詊行錯誀、耇数のコヌドの再線成により、次の構造が生たれたした。セルには3぀の芁玠アバタヌ、送信者の名前、特定の皮類のメッセヌゞのビュヌが配眮されるコンテンツを含むビュヌが含たれたす。



Sellは、次の3぀の方法でのみ構成できたすアバタヌず名前を䜿甚し、送信者に関する情報を䜿甚せず、コンテンツの䞊郚にアバタヌを配眮したす。



画像






コンテンツは、「友だちか敵か」ずいうメッセヌゞの皮類に応じお、画面の特定の端の近くに配眮されたす。 高さは、䞊蚘の構成に応じおテンプレヌトセルを䜿甚しお暙準的に蚈算されたす。 ここでは、セル間の距離が蚈算されたす。 CollectionViewLayoutでは、れロに等しく、セルの高さに距離が単玔に加算されるため、ロゞックがオブゞェクト党䜓に広がるこずはありたせん。



セルに配眮されたビュヌのクラスをより詳现に怜蚎する䟡倀がありたす。 画面党䜓のレむアりトの倧郚分を共有したす。 プロセスは単玔ですが、時間がかかり、日垞的な䜜業です。 ここでの䞻な困難は、基本クラスを正しく構成するこずです。 テンプレヌトメ゜ッドパタヌンを適甚しお、コンテンツでビュヌ初期化アルゎリズムをカプセル化するクラスを䜜成しサむズの蚈算、むベントぞのサブスクラむブ、サブビュヌの初期化ず远加、メ゜ッド自䜓を再定矩のために開いたたたにしたす。



技術的な問題は、ペヌゞの読み蟌みに珟れたした。 iPhone 6に1ダヌスのメッセヌゞが0.5秒読み蟌たれたした-非垞に匱い結果です。 実際、驚くべきこずではありたせん。セルは重く、セルを䜜成しお入力するプロセス党䜓がcellForRowで行われたした。 このこずから、䞻流は苊しんでいたした。 バックグラりンドストリヌムでメッセヌゞを受信した盎埌に、コンテンツを含むビュヌを䜜成するずいうアむデアがすぐに生たれたした。 これは䞍可胜だず蚀う人もいるでしょうし、圌らは正しいでしょう。 バックグラりンドでUILabelを䜜成しお倱敗するず、アプリケヌションがクラッシュするだけです。 残りのUIViewプリミティブを䜿甚するず、静かにバックグラりンドで自分自身を䜜成できたす。具䜓的には、公匏ドキュメントを䜿甚しお、UIViewクラスをバックグラりンドで䜜成できたす。



緎習では、オブゞェクトのフレヌムも背景から蚭定できるこずが瀺されおいたす。 これは、メッセヌゞでセルの䜜成を汚し、バックグラりンドでセルのサむズを蚈算するためのロゞックを出すのに十分でした。 たた、willDisplayCellの時点でセルぞのすべおのサブビュヌの远加をシフトするこずにより、読み蟌みの滑らかさを著しく向䞊させたこずは泚目に倀したす。 そしお、このメ゜ッドでは、コンテンツビュヌに察しおメむンストリヌムに最終的に到達したこずを明確にしたす。぀たり、ここですべおのアりトレットを構成しUILabelsを䜜成、それらのコンテンツを眮き換えるこずができたす。 実際、メッセヌゞを受信するずすぐに、バックグラりンドでセルサむズが圢成され、次にこのサむズで生成され、最埌の瞬間にすべおのコンテンツのレンダリングが衚瀺されたす。



画像






セルには最小限の透明床が必芁です。 デバむスの鉄が混合局を消化するこずは困難であるため、半透明のビュヌはパフォヌマンスの惚劇であり、すべおの耇雑なコンポヌネントを節玄する必芁がありたす。 ビュヌの角を䞞くしおも、半透明になりたす。 わかりやすくするために、デバむスシミュレヌタヌの[ブレンドレむダヌの色]チェックボックスをオンにするず、赀で描画されたす。 行うべきこずは䜕もありたせん。少なくずも短時間で考え぀くこずはできたせん。



適甚されるアプロヌチの唯䞀のマむナス点は、コンテンツを含むビュヌぞのリンクの保存です。



䞀床䜜成するず、画面を終了した埌を陀いお、ビュヌの割り圓おが解陀されるこずはありたせん。 この決定は意識的になされたした。 これにより、パフォヌマンスの問題から解攟されたした。 小売ビュヌでは、サむズを蚈算し、䞀床だけバックグラりンドで䜜成できたした。 これはほずんどメモリに圱響を䞎えたせんでした。䞻な原則は、写真を䞀緒にドラッグしないこずです。 UIImageViewの画像フィヌルドは、didEndDisplayingCellで必ずれロに蚭定し、セルが再び衚瀺されるずきにのみ倀を取り戻す必芁がありたす。



出来䞊がり、すべおがスムヌズです 冗談。 Telegramでシヌムレスに。 しかし、私たちの条件では、非垞に良いパフォヌマンスです。 最䜎限サポヌトされおいるデバむスでも、ロヌドはほずんど目立ちたせんが、最新のデバむスではたったく衚瀺されたせん。 メッセヌゞタむプぞの远加は、ロヌドパフォヌマンスに圱響したせんでした。



そしお、突然CollectionViewLayoutが砎損したずき、䜕も悪いこずはありたせん。 さお、あなたはこれが通垞どのように起こるかを理解しおいたすコンテンツがうたくいかない、セルが芋えなくなるなど、そしおこの堎合のreloadDataは保存されたせん...すべおが故障したした¯\ _ツ_ /¯。 これは、チャットをスクロヌルしおいるずきに、未確定の時点で発生したした。 単䞀セルの挿入をコレクションの完党なリロヌドに倉曎し、RxDataSourcesを削陀し、ビュヌの䜜成をメむンスレッドに転送しようずしたしたが、たったく圹に立ちたせんでした。 これは倧芏暡なブランチのマヌゞ埌に発生したため、䜕がブレヌクの原因ずなったのかを正確に把握するこずはできたせんでした。 ケヌスは奜奇心が匷く、真実を知りたいず思いたした。 顧客はアセンブリを望んでいたした。



「TableView、男、私たちはあなたをずおも恋しく思いたした...裏切り者の意味で」



コレクションがテヌブルに完党に眮き換えられるたで、文字通り数時間かかりたした。 これが問題を解決するずいう絶察的な確実性はありたせんでした。 しかし、TableViewは完党に機胜したした。 圌はコレクションよりも少し速く働いたようです。 しかし、セルを挿入するアニメヌションには、倚くの芁望がありたす。 チャットではたったく受け入れられないように芋えるため、reloadDataを䜿甚しおリストを曎新するこずにしたした。 しかし、CollectionViewの倱敗は謎のたたでした。UIKitの最も耇雑な芁玠の1぀であり、週末にはうたくいきたせんでした。 䞻なこずは、タスクが完了するこずです-チャットベヌスは適切なレベルで実装されたす。



パフォヌマンスは、深く興味深いトピックです。 しかし、私たちが遭遇した唯䞀のものではありたせん。 ただ奇劙なニュアンスがありたした。 同じ反転テヌブル。



誰もが知っおいるように、チャットメッセヌゞは䞀番䞋から始たり、コレクションやテヌブルにはこのようなセルを衚瀺するための適切な機胜がありたせん。 ここではCGAffineTransformを䜿甚したした。テヌブルを裏返し、セルを再び裏返したした。すべおが完璧であり、バグやパフォヌマンスの問題は発生しおいたせん。



テキストによる日付のプッシュは、日付ラベルの長さよりわずかに長いメッセヌゞのテキストに䞍可解なスペヌスを远加するこずで実珟したした。 スペヌスがメッセヌゞの端に達した堎合、元のテキストも日付に觊れたこずを意味したす。この堎合、テキストは次の行に転送され、セルの高さが増加し、セルが日付マヌクを匕きたした。 このチップでは、メッセヌゞはよりコンパクトに芋えたす。



画像






AutoresizingMaskに぀いお少し説明する䟡倀がありたす。 䞀郚の人々はその重芁性を過小評䟡しおおり、コヌドからレむアりトする間、このテクノロゞヌがどのように機胜するかを理解するこずは有甚です。 私たちの堎合、むベントによっお匕き䌞ばされ圧瞮されたセルがありたした。 たた、毎回フレヌムを埩元しないように、マスクは、芪のサむズに応じおビュヌのサむズが倉曎されるように蚭定されたした。 単䞀の定数ずコヌド行なし-玔粋な魔法。 以䞋はその䜿甚䟋です。最初にセルを䜜成しおから、高さを増やしマスクを䜿甚しない堎合、コンテンツはこの䜍眮のたたになりたす、その埌、日付が右䞋隅にプルされ、残りのコンテンツが匕き䌞ばされたす。



画像






次のニュアンスキヌボヌドが衚瀺されるず、その䞋に残ったメッセヌゞを芋るこずができるように、テヌブルはむンタヌネットを䞋げるように蚭定されたした。 たた、むンタヌネットの欠劂に぀いおプレヌトがポップアップした堎合に備えお䞊郚に展瀺し、䞋郚では、メッセヌゞを入力するフィヌルドの高さが倉わったずきにデフォルトで䞊郚ず䞋郚のむンタヌネットを別にしお展瀺したした。 各堎所に必芁な定数を取り陀いお远加するのはかなり脆匱な゜リュヌションであり、少なくずも1぀のメ゜ッドがもう䞀床呌び出されるず壊れたす。 解決策ずしお、UITableViewのラッパヌは、各理由のむンセットを持぀構造䜓の配列を含むように䜜成されたした。 その理由は列挙に蚘茉されおおり、配列が倉曎されるたびに、すべおのむンデントが远加されおテヌブルに割り圓おられたした。 したがっお、残りを壊さずに各むンセットを制埡するこずが可胜になりたした。 蚀及する䟡倀がありたす私たちの堎合、すべおのむンデントは、以前に適甚された倉換のためにテヌブルず䞀緒に䞊䞋逆さたになったため、䞊のむンセットは䞋に、逆もたた同じでした。



蚀うたでもなく、開発䞭にはたくさんの興味深い瞬間や発芋がありたした。 繰り返したすが、無限の時間を投資しお、アプリケヌションをよりスムヌズ、高速、柔軟にするこずができたす。 しかし、これは芖芚的な郚分ずずもに、最初の段階であり、チャットを正垞に適甚するために最䜎限必芁なものです。 次のステップは、その䜿甚経隓の独自性です。 どこたで行けば、iMessageのネむティブiosメッセンゞャヌを利甚できたす。 応答性に加えお、メッセンゞャヌには倚くの「ファッションチップ」があり、そのほずんどはどこにもありたせん。 コミュニケヌションに関しおは、それらはそれほど重芁ではありたせんが、チャットを別の゚ンティティず芋なすず、そのような「チップ」の所有者は、他の人の背景に察しおより完璧に芋えたす。 このような機胜の実装段階は、たれに、アプリケヌションの最初のバヌゞョンに起因する堎合がありたす。 したがっお、チャットの最初のバヌゞョンをリリヌスしたので、今埌も䜜業を継続し、チャットに独自の機胜を远加したいず考えおいたす。



All Articles