簡體   English   中英

循環使用NSPrivateQueueConcurrencyType上下文將數據保存到Core Data會意外地離開循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM