2010-05-12 38 views
0

我需要在內核被推入核心數據庫時更新tableview。當核心數據被推入核心數據時,需要立即更新tableview iphone

此 AppDelegate.m包含下面的代碼

NSManagedObjectContext *moc = [self managedObjectContext]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

[request setEntity:[NSEntityDescription entityForName:@"FeedItem" inManagedObjectContext:moc]]; 
//for loop 
// push data in code data & then save context 
[moc save:&error]; 

ZAssert(error == nil, @"Error saving context: %@", [error localizedDescription]); 
//for loop ends 

此代碼觸發以下從RootviewController.m

- (void)controllerWillChangeContent:(NSFetchedResultsController*)controller 
{ 
[[self tableView] beginUpdates]; 
} 

代碼,但只在for循環結束這個更新的tableview,在數據庫立即推送後,表不會得到更新。

我嘗試下面的代碼,但沒有提前上班

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
// In the simplest, most efficient, case, reload the table view. 
[self.tableView reloadData]; 
} 

我一直堅持這個問題好days.Please help.Thanks的解決方案。

回答

0

聽起來你正在主線程中運行代碼的第一位。由於該線程也控制UI更新,因此在循環完成之前不會發生任何事情。有三種方法可以解決這個問題。

1)從第二個線程更新coredata並將消息傳遞到主線程以告訴它更新UI。這是相當棘手的 - 看看core data multithreading docs一些可怕的警告!

2)不要在for循環中執行更新,而是將它們作爲計時器的一部分。這會給用戶界面時插入即

... 
    self.stuffToUpdate = [NSMutableArray arrayWithObjects:...]; 
    [NSTimer scheduledTimerWithInterval:0.1 target:self selector:@selector(doStuff:) userInfo:nil repeats:YES]; 
    ... 

- (void) doStuff:(NSTimer *)timer { 
    // If there's noting to update, bail 
    if (0 == stuffToUpdate.count) { 
     [timer invalidate]; 
     return; 
    } 

    // Get the next object to update 
    id object = [stuffToUpdate objectAtIndex:stuffToUpdate.count-1]; 
    [stuffToUpdate removeLastObject]; 

    // Do stuff to object 
    [object doStuff]; 

    // Save 
    NSError &error = nil; 
    [moc save:&error]; 

    // Tell the table to update 
    [self.tableView reloadData]; 
} 

但是每個之間進行更新,這樣一個不斷更新的表可能會給奇怪的用戶界面問題 - 你必須嘗試在用戶測試,看看它的工作原理確定。另外,這會減慢更新coredata所花費的總時間,但如果您始終更新UI,這可能不會成爲問題。

3)更改您的應用程序,以便在coredata填充時顯示帶有活動指示符的'請稍候'消息!這樣做容易得多,但如果您的更新花費很長時間,則可能會導致用戶無法使用。

+0

對不起,但我不明白這部分, //獲取下一個要更新的對象 id object = [stuffToUpdate objectAtIndex:stuffToUpdate.count-1]; [stuffToUpdate removeLastObject]; 在我的情況下的對象是RSS飼料項目和下載的文章。這在AppDelegate.m中被推入核心數據中。但是你寫的代碼將在RootviewController.m中。我應該如何使用第二種方法?請幫助 – user336685 2010-05-12 10:39:43