コアデヌタず管理察象ドキュメントを䜿甚しお、最初にオフラむンにしたす

Valentin ChernovはiOS開発者ずしおMegaFonに参加し、今日の䞻なトレンドになりたした-オフラむンになりたすValentinはモバむル個人アカりントを開発しおいたす-MegaFonのメむンアプリケヌションです。残高の確認、料金の倉曎、サヌビスずサヌビスの接続ず切断、コンテストぞの参加、MegaFonパヌトナヌの個人的なオファヌの䜿甚が可胜です。



MegaFonは、その重芁な成長ポむントの1぀ずしお、䞍安定な通信を凊理する機䌚を遞択したした。ロシアには、通信が䞀時的に切断されたり、長期間倱われたりする堎所がありたす。そしお、この堎合でも、アプリケヌションは倱敗するこずなく動䜜する必芁がありたす。



Valentinは、過去5か月間にこのタスクがどのように実行されたか、プロゞェクトのアヌキテクチャがどのように遞択および実装されたか、どのテクノロゞヌが䜿甚されたか、それらが䜕を達成し、将来䜕が蚈画されおいるかに぀いお話したした。Valentinはモバむルアプリケヌション開発者のApps Live2020カンファレンスで話したした。







仕事



ビゞネスによるず、ナヌザヌが䞍安定なネットワヌク接続でアプリケヌションを正垞に操䜜できるように、オフラむンになりたす。私たちは開発チヌムずしお、最初にオフラむンを保蚌する必芁がありたした。アプリケヌションは、䞍安定なむンタヌネットや完党に存圚しないむンタヌネットでも機胜したす。今日は、私たちがどこから始めたのか、そしおこの方向でどのような最初のステップを螏んだのかをお話したす。



テクノロゞヌスタック



暙準のMVCアヌキテクチャに加えお、次のものを䜿甚したす。



Swift + Objective-C



ほずんどのコヌドプロゞェクトの80はObjective-Cで曞かれおいたす。そしおすでにSwiftで新しいコヌドを曞いおいたす。



モゞュラヌアヌキテクチャ



グロヌバルコヌドチャンクをモゞュヌルに論理的に分割しお、コンパむル、プロゞェクトの立ち䞊げ、開発を高速化したす。



サブモゞュヌルラむブラリ



䜿甚されるラむブラリをより现かく制埡するために、gitサブモゞュヌルを介しおすべおの远加ラむブラリを接続したす。したがっお、それらのいずれかのサポヌトが突然停止した堎合、私たちは自分で状況を修正するこずができたす。



ロヌカルストレヌゞのコアデヌタ



遞択する際の䞻な基準は、ネむティブ性ずiOSフレヌムワヌクずの統合でした。そしお、コアデヌタのこれらの利点は決定的でした



  • スタックず受け取ったデヌタを自動保存したす。
  • , ( , ..)
  • ;
  • ;
  • ;
  • ;
  • UI (FRC);
  • (NSPredicates).


UIManaged document



UIキットには、UIDocumentのサブクラスであるUIManagedDocumentず呌ばれる組み蟌みクラスがありたす。その䞻な違いは、管理察象ドキュメントが初期化されるずきに、ロヌカルストレヌゞたたはリモヌトストレヌゞ内のドキュメントの堎所にURLが指定されるこずです。次に、ドキュメントオブゞェクトは、箱から出しおすぐにコアデヌタスタックを完党に䜜成したす。これは、メむンアプリケヌションパッケヌゞのオブゞェクトモデル.xcdatamodeldを䜿甚しおドキュメントの氞続ストレヌゞにアクセスするために䜿甚されたす。私たちはすでに21䞖玀に䜏んでいたすが、それは䟿利で理にかなっおいたす。



  • UIDocumentは、特定の頻床で珟圚の状態自䜓を自動保存したす。特に重芁なセクションでは、手動で保存をトリガヌできたす。
  • . - — , , - , — , , .
  • UIDocument .
  • Core data .
  • iCloud . , .
  • .
  • ドキュメントベヌスのアプリパラダむムが䜿甚されたす-このデヌタを栌玍するためのコンテナずしおデヌタモデルを衚したす。Appleのドキュメントで埓来のMVCモデルを芋るず、コアデヌタはこのモデルを操䜜するために正確に䜜成されおおり、より高いレベルの抜象化でデヌタを凊理するのに圹立ちたす。モデルレベルでは、UIManagedDocumentを䜜成されたスタック党䜓に接続するこずで機胜したす。たた、ドキュメント自䜓を、コアデヌタずキャッシュからのすべおのデヌタ画面、ナヌザヌからを栌玍するコンテナヌず芋なしたす。さらに、写真、ビデオ、テキストなど、あらゆる情報を含めるこずができたす。


アプリケヌション、その起動、ナヌザヌ認蚌、およびそのすべおのデヌタは、ナヌザヌの履歎を栌玍する䞀皮の倧きなドキュメントファむルず芋なされたす。







凊理する



アヌキテクチャの蚭蚈方法



私たちの蚭蚈プロセスはいく぀かの段階で行われたす。



  1. 技術仕様の分析。
  2. UMLダむアグラムのレンダリング。䞻にクラス図、フロヌチャヌト、シヌケンス図の3皮類のUML図を䜿甚したす。これは䞊玚開発者の盎接の責任ですが、経隓の少ない開発者もこれを行うこずができたす。これは、タスクにうたく飛び蟌み、そのすべおの埮劙な点を孊ぶこずができるので、歓迎されおいたす。これは、技術的な割り圓おの欠陥を芋぀けるのに圹立぀だけでなく、タスクに関するすべおの情報を構造化するのにも圹立ちたす。たた、アプリケヌションのクロスプラットフォヌムの性質を考慮に入れようずしおいたす。Androidチヌムず緊密に連携し、2぀のプラットフォヌムで同じ図を描き、4人のギャングから䞀般的に受け入れられおいる䞻なデザむンパタヌンを䜿甚しようずしおいたす。
  3. アヌキテクチャのレビュヌ。原則ずしお、隣接するチヌムの同僚がレビュヌず評䟡を行いたす。
  4. 1぀のUIモゞュヌルの䟋での実装ずテスト。
  5. スケヌリング。テストが成功した堎合、アプリケヌション党䜓でアヌキテクチャを拡匵したす。
  6. リファクタリング。私たちが䜕かを逃したかどうかを確認するため。


このプロゞェクトを開発しおから5か月埌、プロセス党䜓を3぀の段階で瀺すこずができたす。䜕が起こったのか、どのように倉化したのか、そしお結果ずしお䜕が起こったのかです。



どうした



私たちの出発点は、暙準のMVCアヌキテクチャでした-これらは盞互接続されたレむダヌです



  • 目的Cを䜿甚しお完党にプログラムされたUIレむダヌ。
  • プレれンテヌションクラスモデル;
  • ネットワヌクず連携するサヌビスレむダヌ。


アクティビティむンゞケヌタは、デヌタを受信するプロセスがむンタヌネットの速床に敏感である図の堎所に配眮されたした。ナヌザヌは迅速な結果を望んでいたすが、䞀郚のロヌダヌ、むンゞケヌタ、およびその他の信号を確認する必芁がありたす。これらは、ナヌザヌ゚クスペリ゚ンスの成長のポむントでした。







移行期間



移行期間䞭、画面のキャッシュを実装する必芁がありたした。ただし、アプリケヌションは倧きく、レガシヌのObjective Cコヌドが倚数含たれおいるため、Swiftコヌドを挿入しおすべおのサヌビスずモデルを削陀するこずはできたせん。キャッシュず䞊行しお、他にも倚くの補品タスクが開発䞭であるこずを考慮する必芁がありたす。



䜕も壊すこずなく、珟圚のコヌドに可胜な限り効率的に統合し、最初の反埩を可胜な限りスムヌズに実行するための簡単な方法を芋぀けたした。前の図の巊偎では、ネットワヌク芁求に関連するすべおのものを完党に削陀したした。サヌビスは、むンタヌフェむスを介しおDataSourceFacadeず通信するようになりたした。そしお今、これはサヌビスが機胜するファサヌドです。 DataSourceから、以前にネットワヌクから受信したデヌタを期埅したす。たた、デヌタデヌタ自䜓には、このデヌタを抜出するためのロゞックが隠されおいたす。



図の右偎では、デヌタ取埗をコマンドに分割しおいたす。コマンドパタヌンは、いく぀かの基本的なコマンドを実行しお結果を取埗するこずを目的ずしおいたす。 iOSの堎合、NSOperationの継承者を䜿甚







したす。ここに衚瀺される各コマンドは、予期されるアクションの論理ナニットを含む操䜜です。これは、デヌタベヌスたたはネットワヌクからデヌタを取埗し、このデヌタをコアデヌタに栌玍するこずです。たずえば、AcquireCommandの䞻なタスクは、デヌタ゜ヌスをファサヌドに戻すだけでなく、ファサヌドを介しおデヌタを受信するようにコヌドを蚭蚈する機胜を提䟛するこずです。぀たり、操䜜ずの察話はこのファサヌドを通過したす。



そしお、操䜜の䞻なタスクは、DataSourceデヌタをDataSourceFacadeに枡すこずです。もちろん、デヌタをできるだけ早くナヌザヌに衚瀺するようにロゞックを構築したす。通垞、DataSourceFacade内には、NSOperationsを開始する操䜜キュヌがありたす。構成された条件に応じお、キャッシュからのデヌタを衚瀺するタむミングず、ネットワヌクから受信するタむミングを決定できたす。ファサヌド内のデヌタ゜ヌスの最初の芁求で、コアデヌタデヌタベヌスに移動し、そこからFetchCommand存圚する堎合を介しおデヌタを取埗し、すぐにナヌザヌに返したす。



同時に、ネットワヌクを介しおデヌタの䞊列芁求を開始し、この芁求が実行されるず、結果がデヌタベヌスに送られ、デヌタベヌスに保存され、その埌、デヌタデヌタの曎新を受け取りたす。このアップデヌトはすでにUIにありたす。このようにしお、デヌタの埅機時間を最小限に抑え、デヌタを即座に受信するナヌザヌは違いに気づきたせん。デヌタベヌスがネットワヌクから応答を受信するずすぐに、曎新されたデヌタを受信したす。



どのようになりたしたか



私たちはそのようなより簡朔な蚈画に行きたすそしお私たちは最埌に来るでしょう







今これから私たちは持っおいたす



  • UIレむダヌ、
  • デヌタデヌタを提䟛するファサヌド、
  • このデヌタデヌタを曎新ずずもに返すコマンド。


DataSourceずは䜕ですか、なぜそれに぀いお倚く話すのですか



DataSourceは、プレれンテヌションレむダヌにデヌタを提䟛し、事前定矩されたプロトコルに埓うオブゞェクトです。たた、プロトコルをUIに合わせお調敎し、UIのデヌタを提䟛する必芁がありたす特定の画面や画面のグルヌプには関係ありたせん。



DataSourceには通垞、2぀の䞻な責任がありたす。



  1. UIレむダヌに衚瀺するためのデヌタを提䟛したす。
  2. デヌタの倉曎をレむダヌUIに通知し、曎新を受信したずきに必芁な倉曎のバッチを画面に送信したす。


ここでは、Objective Cのレガシヌコヌドが倚数あるため、ここではDataSourceのいく぀かのバリアントを䜿甚したす。぀たり、SwiftDataSourceをどこにでも簡単に貌り付けるこずはできたせん。たた、ただどこでもコレクションを䜿甚しおいたせんが、将来的には、CollectionView画面を䜿甚するようにコヌドを曞き盎したす。



DataSourceの1぀の䟋







これはコレクションのDataSourceCollectionDataSourceず呌ばれたすであり、むンタヌフェむスの芳点からはかなり単玔なクラスです。 fetchedResultsControllerずCellDequeueBlockによっお構成されたコレクションを取り蟌みたす。 CellDequeueBlockは、セルを䜜成するための戊略を説明するタむプ゚むリアスです。



぀たり、DataSourceを䜜成し、fetchedResultsControllerでperformFetchを呌び出しおコレクションに割り圓おた埌、すべおの魔法がDataSourceクラス、fetchedResultsControllerの盞互䜜甚、およびデヌタベヌスから曎新を受信するデリゲヌトの機胜に割り圓おられたす







。FetchedResultsControllerはDataSourceの䞭心です。 Appleのドキュメントには、この操䜜に関する倚くの情報が蚘茉されおいたす。原則ずしお、新しいデヌタず曎新たたは削陀されたデヌタの䞡方の助けを借りお、すべおのデヌタを受け取りたす。同時に、ネットワヌクからのデヌタを同時に芁求したす。デヌタが受信されおデヌタベヌスに保存されるずすぐに、デヌタデヌタから曎新が受信され、曎新がUIに届きたした。぀たり、1぀のリク゚ストでデヌタを受け取り、さたざたな堎所に衚瀺したす。クヌルで䟿利、ネむティブです。



たた、テヌブルたたはコレクションで既補のDataSourceを䜿甚できる堎合は垞に、それを実行したす。







画面やテヌブルが倚く、コレクションが䜿甚されおいないそしおObjective Cプログラミングが䜿甚されおいる堎所では、必芁なデヌタを評䟡したす。画面甚に、プロトコルを通じおDataSourceに぀いお説明したす。その埌、ファサヌドを䜜成したす。原則ずしお、これは、デヌタデヌタを芁求するためのパブリックObjectiveCプロトコルでもありたす。そしお、Swiftコヌドぞの入り口はすでに進行䞭です。



画面をSwift実装に完党に転送する準備ができたら、Objective Cラッパヌを削陀するだけで十分です。カスタムDataSourceのおかげで、Swiftプロトコルを盎接操䜜できたす。



珟圚、デヌタデヌタの3぀の䞻芁なバリアントを䜿甚しおいたす。

  1. TableViewDatasource +セル戊略セルを䜜成するための戊略;
  2. CollectionViewDatasource +セル戊略コレクションのオプション;
  3. CustomDataSourceはカスタムオプションです。今䞀番䜿っおいたす。




結果



レガシヌコヌドを蚭蚈、実装、および操䜜するためのすべおのステップの埌、ビゞネスは次の改善を受けたした。



  • キャッシングにより、ナヌザヌぞのデヌタ配信速床が倧幅に向䞊したした。これはおそらく明癜で論理的な結果です。
  • これで、オフラむンの最初のパラダむムに䞀歩近づきたした。
  • アヌキテクチャのクロスプラットフォヌムレビュヌのプロセスは、iOSおよびAndroidチヌム内で蚭定されおいたす。このプロゞェクトに関䞎するすべおの開発者は情報を持っおおり、チヌム間で簡単に経隓を亀換できたす。
  • . , , legacy , .
  • , — . , , , , , .


私たちにずっおのボヌナスは、アヌキテクチャず図の操䜜がいかに面癜くお楜しいかを理解したこずですこれにより開発が簡玠化されたす。はい、アヌキテクチャアプロヌチの描画ず調敎に倚くの時間を費やしたしたが、実装に関しおは、すべおの画面で非垞に迅速にスケヌリングしたした。



オフラむンぞのパスは最初に続きたす-オフラむンにするためにキャッシュする必芁があるだけでなく、ナヌザヌはネットワヌク接続なしで操䜜でき、むンタヌネットが衚瀺された埌にサヌバヌずさらに同期したす。



リンク



  • ドキュメントベヌスのプログラミングガむド。これはかなり叀いドキュメントであり、Appleはもはやそれを䜿甚するこずを掚奚しおいたせん。しかし、少なくずも远加の開発を探すこずをお勧めしたす。そこにはたくさんの圹立぀情報がありたす。
  • Document-based WWDC:
  • DataSources


Apps Live 2020 .

— Android iOS, . , , .




All Articles