私はまだ RSS リーダーのコーディングを行っていますが、フィードを最新の投稿で一度にバックグラウンドで埋めることで、物事をよりスムーズに進めたいと考えています。
問題は、次のようなメッセージでアプリがひどくクラッシュすることです。
2013-10-02 21:06:25.474 uRSS[97209:a0b] *** Terminating app due to uncaught
exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource
must return a cell from tableView:cellForRowAtIndexPath:'
(スタックトレース)
私はここでスレッド セーフを実行していないという結論に達し、この種の CoreData スニペットを発見しました。
//Core Data's NSPrivateQueueConcurrencyType and sharing objects between threads
[context performBlock:^{
// fetch request code
NSArray *results = [context executeFetchRequest:request error:nil];
dispatch_async(dispatch_get_main_queue(), ^(void) {
Class *firstObject = [results objectAtIndex:0];
// do something with firstObject
});
}];
// Assume we have these two context (They need to be set up. Assume they are.)
NSManagedObjectContext *mainMOC = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType] autorelease];
NSManagedObjectContext *backgroundMOC = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease];
// Now this can safely be called from ANY thread:
[backgroundMOC performBlock:^{
NSArray *results = [context executeFetchRequest:request error:nil];
for (NSManagedObject *mo in results) {
NSManagedObjectID *moid = [mo objectID];
[mainMOC performBlock:^{
NSManagedObject *mainMO = [mainMOC objectWithID:moid];
// Do stuff with 'mainMO'. Be careful NOT to use 'mo'.
}];
}
}];
今、私が知りたいのは次のことです。
- backgroundMOC を Class メンバー プロパティとして定義する必要がありますか、それともそれを使用するメソッドが呼び出されるたびに定義する必要がありますか?
- このメソッド自体が非同期で呼び出された場合はどうなるでしょうか (RSS 解析メソッドがその場でオブジェクトを作成します)。
- クラッシュせずに更新できるように、MOC が更新されたことを UITableView に安全に通知するにはどうすればよいですか?
- これはフェッチにのみ適用されますか、それともオブジェクトの挿入、削除などにも適用されますか?
- この概念がうまく適用された実際の例はどこにありますか?