私は IOS を初めて使用し、Web サービスからデータを取得しています。このデータはコアデータに保存します。現時点では、すべてのデータを最初のビュー コントローラー (テーブルビュー) に読み込んでいます。ただし、テーブルビューがいっぱいになり、すべてのデータがコア データベースに格納されるまでに約 10 分かかります。だから私はベストプラクティスが何であるか疑問に思っていました。だから私はディスパッチキューを扱いたいです。しかし、それを使用する最良の方法は何ですか?
最初の方法
- 最初のビューからの最初のストア データ
- このデータでテーブルビューを埋めます
- 残りのデータを db に保存します。
しかし、次のビューに移動して、すべてのデータが読み込まれていない場合はどうなるでしょうか?
2番目の方法
- 最初のビューからデータを保存する
- テーブル ビューをこのデータで埋めますか?
- ユーザーが 2 番目のビューに移動すると、2 番目のビューのデータを保存します
- このデータを使用して 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];
}