将device / xCode更新到iOS 8.3后,当我进行后台更新时,我的应用程序开始崩溃。 这是我的managedObjectContext / persistentStoreCoordinator方法:
- (NSManagedObjectContext *)managedObjectContext {
NSThread *thisThread = [NSThread currentThread];
if (thisThread == [NSThread mainThread]) {
return self.mainContext;
}
NSString * threadKey = [NSString stringWithFormat:@"%p", thisThread];
NSManagedObjectContext * threadContext = nil;
@synchronized(self.managedObjectContexts) {
threadContext = self.managedObjectContexts[threadKey];
}
if (!threadContext) {
threadContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
threadContext.parentContext = self.mainContext;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:threadContext];
@synchronized(self.managedObjectContexts) {
[self.managedObjectContexts setObject:threadContext forKey:threadKey];
}
}
return threadContext;
}
+ (NSString*)managedObjectContextKeyForThread:(NSThread*)thread {
return [NSString stringWithFormat:@"%i", (int)thread];
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (!persistentStoreCoordinator) {
NSManagedObjectModel *objectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:self.modelURL];
if(objectModel) {
NSPersistentStoreCoordinator *storeCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:objectModel];
NSDictionary * options = @{NSMigratePersistentStoresAutomaticallyOption : @(YES),
NSInferMappingModelAutomaticallyOption : @(YES)
};
NSError* error = nil;
if ([storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.storeURL
options:options error:&error])
{
persistentStoreCoordinator = storeCoordinator;
} else {
NSError *err = nil;
[[NSFileManager defaultManager] removeItemAtURL:self.storeURL error:&err];
if ([storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.storeURL
options:options error:&error])
{
[[NSNotificationCenter defaultCenter] postNotificationName:kDatabaseRecreatedNotificationKey object:nil];
persistentStoreCoordinator = storeCoordinator;
}
}
}
}
return persistentStoreCoordinator;
}
它在contextDidSave方法中崩溃并显示错误消息:
在Debug Navigator的第一个异常断点中,它显示了另一行 - " developerSubmittedBlockToNSManagedObjectContextPerform"
我的代码出了什么问题?它在8.3之前工作正常。也许,Apple增加了新的规则? 谢谢你的帮助。
答案 0 :(得分:0)
这也发生在我和8.3的发布上。如果你的情况与我的情况一样,你在viewDidLoad中设置了self.mainContext(你没有显示ivar的设置位置)。但我可以在调试器中看到现在正在viewDidLoad之前调用fetchedResultsController。我的修复是将我的self.mainContext等效设置移动到init方法中,在我的例子中是initWithCoder。
答案 1 :(得分:0)
经过大量工作和头痛后,我已转移到Magical Record library并实现了我的主要目标 - 使用Core Data更新后台数据。