0

私は IOS を初めて使用し、Web サービスからデータを取得しています。このデータはコアデータに保存します。現時点では、すべてのデータを最初のビュー コントローラー (テーブルビュー) に読み込んでいます。ただし、テーブルビューがいっぱいになり、すべてのデータがコア データベースに格納されるまでに約 10 分かかります。だから私はベストプラクティスが何であるか疑問に思っていました。だから私はディスパッチキューを扱いたいです。しかし、それを使用する最良の方法は何ですか?

  • 最初の方法

    1. 最初のビューからの最初のストア データ
    2. このデータでテーブルビューを埋めます
    3. 残りのデータを db に保存します。

しかし、次のビューに移動して、すべてのデータが読み込まれていない場合はどうなるでしょうか?

  • 2番目の方法

    1. 最初のビューからデータを保存する
    2. テーブル ビューをこのデータで埋めますか?
    3. ユーザーが 2 番目のビューに移動すると、2 番目のビューのデータを保存します
    4. このデータを使用して 2 番目のビューを読み込みます。

データは常に正しく保存されますが、ユーザーはアプリを使用する前に待機する必要があります。(そのビューのデータがロードされていないためです。)

現時点では、最初の方法を使用しています。ディスパッチ キューの操作。こんな感じで使っています。

- (void)fetch1:(UIManagedDocument *)document
{
    dispatch_queue_t fetchQ = dispatch_queue_create("NewsFetch", NULL);
    dispatch_async(dispatch_get_main_queue(), ^{
        //store data in core database for firstViewController and save document.
        [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
        [self loadFirstTableView];
        [self fetch2];
    });
    dispatch_release(fetchQ);

}
- (void)fetch2:(UIManagedDocument *)document
{
    dispatch_queue_t fetchAlbum = dispatch_queue_create("Album fetcher", NULL);
    dispatch_async(fetchAlbum, ^{
       //store data for secondViewController
        [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];


    dispatch_release(fetchAlbum);
}

誰でも私を助けることができますか?

敬具

編集

Web サービスからデータを取得する方法は次のとおりです。

 NSArray *news = [GenkData getNews]; //gets all the data from webservice as JSON
        for (NSDictionary *genkInfo in news) {
            [News newsWithGenkInfo:genkInfo  inManagedObjectContext:document.managedObjectContext];
        }
        [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];

そして、これが私のテーブルビューのセットアップ方法です。

- (void)setupFetchedResultsController // attaches an NSFetchRequest to this UITableViewController
{
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"News"];

    request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES],nil];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                managedObjectContext:self.genkDatabase.managedObjectContext
                                sectionNameKeyPath:nil
                                cacheName:nil];

}
4

1 に答える 1

2

パフォーマンスの問題が発生した場合、最初の反応はマルチスレッドを導入することではありません。そのため、軽視すべきではない複雑さが増し、アーキテクチャに細心の注意を払う必要があります。

代わりに、への配線に関するRayWenderlichの優れたチュートリアルをご覧になることを強くお勧めします。NSFetchedResultsControllerUITableView

NSFetchedResultsController必要なデータのみをロードでき、ユーザーの要求に応じてコンテンツのバッチを自動的にフェッチします。それはあなたの記憶を節約します。時間が大幅に短縮されます。それはあなたのユーザーを幸せにするでしょう。

ここでチュートリアルをチェックしてください:http ://www.raywenderlich.com/999/core-data-tutorial-how-to-use-nsfetchedresultscontroller

編集

それで、あなたの編集に基づいて、これが私があなたの要件をどのように設計するかです。

  1. 非同期HTTPリクエストを使用してWebサービスからデータをフェッチする必要があります。これを使用するのは簡単で、このNSURLRequestようなライブラリを使用すると、AFNetworkingこれがさらに簡単になります。

  2. Webサービスからデータをフェッチしているので、本当にそのデータをCore Dataに挿入する必要がありますか?より簡単なのは、HTTP応答をキャッシュして、そこからテーブルビューを直接ロードすることです。

  3. HTTP応答が得られたので、UITableViewリロードするように指示します。リロードするときに、デリゲートメソッドを使用してテーブルデータを提供します。Core Dataを使用しない場合は、これ以上混乱する必要はありNSFetchedResultsControllerません。

Webサービスが大量のデータを返す場合は、結果をバッチでフェッチするためのページングメカニズムをコーディングする必要があります。これは次のように機能します。ユーザーがテーブルビューの最後に到達すると、次の25個のアイテムを取得するための別のリクエストを送信します。一般的な経験則:必要になるまでデータをフェッチしないでください。

最後に、このすべてのフェッチで、何が起こっているのかをユーザーに伝えたいと思うでしょう。それをチェックしてくださいSVProgressHUD

お役に立てば幸いです。

于 2012-10-23T20:44:43.243 に答える