次のコードを使用して、Webサービスからデータをロードし、CoreDataDBに保存します。
dispatch_queue_t fetchQ = dispatch_queue_create("fetcher", NULL);
dispatch_async(fetchQ, ^{
NSArray *list = [WebService loadData];
dispatch_sync(dispatch_get_main_queue(), ^{
if (list != nil) {
for (NSDictionary *data in list) {
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:appDelegate.coreDataDatabase.managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id = %i", [[data objectForKey:@"id"] integerValue]];
[request setPredicate:predicate];
NSError *error = nil;
NSArray *data = [appDelegate.coreDataDatabase.managedObjectContext executeFetchRequest:request error:&error];
Object *object = [data objectAtIndex: 0];
if (object == nil) {
object = [NSEntityDescription insertNewObjectForEntityForName:@"Object" inManagedObjectContext:appDelegate.coreDataDatabase.managedObjectContext];
object.id = [NSNumber numberWithInteger:[[data objectForKey:@"id"] integerValue]];
}
object.name = [data objectForKey:@"name"];
}
[appDelegate.coreDataDatabase saveToURL:appDelegate.coreDataDatabase.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil];
}
});
});
dispatch_release(fetchQ);
コードは単純化されていますが、シーケンスを表す必要があります。Webサービスへのアクセスはバックグラウンドで実行されます。その後、ストアはメインスレッドで呼び出されます。実際に大丈夫ですか?
残念ながら、全体がすべてのデバイスで機能するわけではありません。私のすべてのデバイスと他のほとんどのデバイスで、問題はありません。いくつかの、しかし明らかにそうです、残念ながら店にはいくつかの否定的なBewertugnenといくつかの質問があるからです。問題は、彼がDBに既存のレコードを見つけ、常に新しい投資をしているわけではないことです。
助けてくれてありがとう、ステファン