Core Data と Grand Central Dispatch を使用して をセットアップしUITableview
、アプリを更新して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
上記の方法は一度は機能しましたが、複製することはできませんでした。