我刚刚UITableview
使用 Core Data 和 Grand Central Dispatch 设置了一个来更新我的应用程序并通过我的fetchedResultsController
. 我有应用程序更新我的数据库;但是,UITableView
只有在我通过 Xcode 将应用程序重新部署到手机后才会填充。例如,我运行更新,一切正常,除了我有一个空的UITableView
. 然后我可以关闭应用程序并通过 Xcode 再次单击“运行”,当应用程序出现时,信息位于UITableView
. 我包括下面的代码,希望有人可以帮助我发现为什么会这样。如果我需要包含更多代码,请告诉我。谢谢!
TeamTableViewController.m
- (NSFetchedResultsController \*)fetchedResultsController {
...
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchREquest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"stateCode" cacheName:nil];
self.fetchedResultsController = aFetchedResultsController;
...
}
-(IBAction) refreshList:(id)sender {
dispatch_queue_t queue = dispatch_queue_create("updateQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue,^ { [self updateFromXMLFile:@"https://path/to/file.xml"];});
dispatch_async(queue,^ { [self updateFromXMLFile:@"https://path/to/file2.xml"];});
dispatch_async(queue,^ { [self updateFromXMLFile:@"https://path/to/file3.xml"];});
}
- (BOOL)updateFromXMLFile:(NSString *)pathToFile {
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
XMLParser *parser1 = [[XMLParser alloc] initXMLParser];
XMLParser *parser2 = [[XMLParser alloc] initXMLParser];
XMLParser *parser3 = [[XMLParser alloc] initXMLParser];
BOOL success = FALSE;
NSURL *url = [[NSURL alloc] initWithString:pathToFile];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
if ([pathToFile rangeOfString:@"people"].location != NSNotFound) {
NSManagedObjectContext * peopleMOC = [[NSManagedObjectContext alloc] init];
[peopleMOC setPersistentStoreCoordinator:[appDelegate persistentStoreCoordinator]];
NSNotificationCenter * notify = [NSNotificationCenter defaultCenter];
[notify addObserver:self selector:@selector(mergeChanges:) name:NSManagedObjectContextDidSaveNotification object: peopleMOC];
parser1.managedObjectContext = peopleMOC;
[xmlParser setDelegate: parser1];
success = [xmlParser parse];
if (success) {
NSError * error = nil;
@try {
[parser1.managedObjectContext save:&error];
} catch (NSException * exception) {
// NSLog logs the exception...
}
[NSNotificationCenter defaultCenter] removeObserver:self];
Return TRUE;
} else {
// NSLog logs errors
return FALSE;
}
} elseif ... { // other 3 use practically same code here }
[appDelegate saveContext];
}
-(void) mergeChanges:(NSNotification *) notification {
AppDelegate *theDelegate = [[UIApplication sharedApplication] delegate];
[[theDelegate managedObjectContext] performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject: notification waitUntilDone:YES];
}
更新
我可以通过添加[theDelegate saveContext];
到我的-(void)mergeChanges
方法的末尾来让它工作......这对我来说似乎不是正确的方法。想法?
更新 2
上述方法曾经奏效,但我一直无法复制它。