0

Core Data と Grand Central Dispatch を使用して をセットアップしUITableview、アプリを更新してfetchedResultsController. アプリケーションでデータベースを更新しています。ただし、UITableViewXcode を使用してアプリケーションを電話に再デプロイした場合にのみ、データが取り込まれます。たとえば、更新を実行すると、空の があることを除いてすべて正常に動作します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して、View Controller にデータの変更を通知する必要があります。

controllerDidChangeContent:他の方法ではなく使用してください。このように、すべてのダウンロードが完了すると結果が反映されます。増分更新を短くすると、計算コストが高くなる可能性があります。

デリゲートのドキュメントには、非常に簡潔な「典型的な使用」の例があります。

于 2012-08-18T06:22:23.743 に答える