0

我刚刚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

上述方法曾经奏效,但我一直无法复制它。

4

1 回答 1

0

您应该使用该NSFetchedResultsControllerDelegate协议来通知您的视图控制器数据的任何更改。

使用controllerDidChangeContent:而不是其他方法。像这样,一旦所有下载完成,结果就会反映出来。较短的增量更新可能会在计算上变得昂贵。

委托文档中有一个非常简洁的“典型使用”示例。

于 2012-08-18T06:22:23.743 回答