2012-06-19 22 views
0

好吧,這就是情況。我正在製作一個程序,您可以在其中保存和加載包含文本和圖像(一些相當大的圖像)的文檔。對於後端,我使用的CoreData與UIManagedDocument和我自己的子類(我們將其稱爲NotificationDocument)的NSManagedDocument在iOS中從CoreData獲取數據的快速方法是什麼?

現在,每個NotificationDocument都有兩個屬性,分別代表保存的保存位置和保存的名稱。我有一個TableView,它顯示我的文檔列表以及它們保存的插槽(例如:「Save Slot 1:Cleaning Template」)。

但是,我需要FOREVER填充此tableview。什麼我做的是在viewDidLoad中是:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"NotificationDocument"]; 
NSArray *notifications = [self.database.managedObjectContext executeFetchRequest:fetchRequest error:nil]; 

,看來合理懷疑我的程序運行很慢,因爲我檢索所有notificationDocuments的全部,並將它們移動到內存中。有沒有更好的(更快)的方式來做到這一點,因爲我真的不需要所有的notificationDocuments,我只需要他們的保存槽和保存名稱屬性。什麼是實現這一目標的最佳方式?

我曾想過在CoreData中存儲一個映射實體映射保存槽到保存在其中的名稱。但是,如果沒有保存完全獨立的實體的方法來做到這一點,那將是更可取的。謝謝。

回答

3

您應該使用NSFetchedResultsController動態填充您的UITableView。這樣,它會在請求新的單元格時動態地創建核心數據調用,而不是您當前的方法,即使在加載視圖時不需要大部分數據,也可以一次加載所有數據。

下面是大致的代碼,你應該設置備份數據(fetchedResultsController應該是視圖控制器它是在一個屬性)

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"NotificationDocument"]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"attribute" ascending:NO]; 
    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 


    fetchedResultsController = [[NSFetchedResultsController alloc] 
           initWithFetchRequest:fetchRequest 
           managedObjectContext:self.database.managedObjectContext 
           sectionNameKeyPath:nil 
           cacheName:@"ListCache"]; 
    fetchedResultsController.delegate = self; 
    NSError *error = nil; 
    [fetchedResultsController performFetch:&error]; 

這裏是抓住正確的文件中cellForRowAtIndexPath行(顯然可能不是正確的對象類)

NotificationDocument *currentDocument = [fetchedResultsController objectAtIndexPath:indexPath]; 

這樣做,你會發現一個巨大的速度提高。

0

正如迪馬所說,可能使用NSFetchedResultsController是一種可行的方法。

我使用它之前,如果你想看看,看看這個:

https://github.com/rafaeladson/intern-objc/blob/master/InternIOS/BaseTableViewController.m

https://github.com/rafaeladson/intern-objc/blob/master/UnitTests/SampleTableViewController.m

https://github.com/rafaeladson/intern-objc/blob/master/UnitTests/BaseTableViewControllerTest.m

如果這不起作用,嘗試使用從Xcode的儀器應用程序來分析你的問題是什麼。

0

在oreder檢索一組從核心數據項的你也可以用

[nsfetchReqObj setFetchBatchSize:size]; 

它將增加也取的速度。

相關問題