![](/img/trans.png)
[英]Storing thread context specific data in a Core Data NSPrivateQueueConcurrencyType thread
[英]Looping to save data to Core Data with NSPrivateQueueConcurrencyType context leaves loop unexpectedly
我在connectionDidFinishLoading:connection
使用此代碼connectionDidFinishLoading:connection
NSURLConnection異步委托方法,同時下載大量數據。
- (void)saveCompatibilities:(NSArray *)objects {
//setup tempMoc
UIApplication *app = [UIApplication sharedApplication];
AppDelegate *appDelegate = (AppDelegate *)app.delegate;
NSManagedObjectContext *moc = appDelegate.managedObjectContext;
NSPersistentStoreCoordinator *storeCoordinator = moc.persistentStoreCoordinator;
NSManagedObjectContext *tempMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
tempMoc.persistentStoreCoordinator = storeCoordinator;
NSString *entityName = NSStringFromClass([Compatibility class]);
for (NSDictionary *newObjectDict in objects) {
[tempMoc performBlock:^{
Compatibility *object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:tempMoc];
object.prod1 = newObjectDict[@"prod1"];
object.prod2 = newObjectDict[@"prod2"];
object.prod3 = newObjectDict[@"prod3"];
object.region = newObjectDict[@"region"];
object.result = newObjectDict[@"result"];
NSLog(@"%@", object);
}];
}
//do some other stuff here ...
tempMoc = nil;
}
這段代碼運行正常並保存了一些對象,但在這個錯誤的中間崩潰:
由於未捕獲的異常'NSInternalInconsistencyException'而終止應用程序,原因:'+ entityForName:無法找到實體名稱的'NSManagedObjectModel'兼容性''
我設置了斷點,並了解到最后一行tempMoc = nil;
保存一些對象后被擊中,但不離開該功能。 它只是回到循環中,因為tempMoc
現在為零,所以會發生錯誤。
為什么不完成循環遍歷對象數組? 它確實離開循環為什么不將功能全部放在一起? 我假設它是由於多線程,我是新手。
這是因為多線程。 稍后可能會在方法完成后在不同的線程上調用performBlock。 這意味着在tempMoc設置為nil之后。 我認為你應該把for循環放在peformBlock中
[tempMoc performBlock:^{
for (NSDictionary *newObjectDict in objects) {
Compatibility *object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:tempMoc];
object.prod1 = newObjectDict[@"prod1"];
object.prod2 = newObjectDict[@"prod2"];
object.prod3 = newObjectDict[@"prod3"];
object.region = newObjectDict[@"region"];
object.result = newObjectDict[@"result"];
NSLog(@"%@", object);
}
}];
我認為你最終不需要將tempMoc設置為nil。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.