2011-04-04 43 views
1

使用NSFetchedResultsController實現Core Data對象的運行時過濾的最佳方式是什麼?例如,我希望能夠顯示RecordStore實體中的所有記錄實體,但也要篩選某個預定義標準的RecordStore中的所有記錄,例如(ANY recordStore.records.count> 0)。在運行時過濾NSFetchedResultsController結果

我讀到,它創建後更改NSFetchedResultsController的謂詞是不好的。所以我應該將獲取的結果存儲在一個NSArray中,我可以過濾並將其用作UITableView的數據源,或者我應該創建多個NSFetchedResultsControllers?

回答

2

當您需要更新時,您可以重新獲取數據。如果數據本身發生了變化,那麼您可以再次調用fetch。如果你的標準改變了,那麼在你的NSFetchedResultsController上設置謂詞,然後調用fetch。

+0

這意味着我將無法利用NSFetchedResultsController的內置緩存中,並從我的理解,抓取是一個非常昂貴的操作。 – hwaxxer 2011-04-04 15:32:20

+5

抓取並不是特別昂貴,特別是與將獲取的對象數組永久保存在內存中相比,這是您的其他選項。 NSFetchedResultsController通常只用於較大的相對靜態表。不要去尋找你可能沒有的性能問題。首先使用最簡單的解決方案,然後再採用更復雜的解決方案,只有在測試後顯示最簡單的解決方案不起作用。 – TechZen 2011-04-04 20:29:14

+0

好點。我會接受上面的答案。 – hwaxxer 2011-04-06 09:21:38

0

創建NSFetchRequest實例,每次更新請求並執行提取。如果您使用刪除緩存:

let shortDescriptor = NSSortDescriptor(key: key, ascending: ascending) 


    fetchedResultViewController.fetchRequest.sortDescriptors = [shortDescriptor] 

    NSFetchedResultsController<NSFetchRequestResult>.deleteCache(withName: fetchedResultViewController.cacheName) 

    do { 
     try fetchedResultViewController?.performFetch() 
    } catch let error as NSError { 
     print("Error in fetch \(error)") 
    } 

閱讀蘋果文檔:https://developer.apple.com/reference/coredata/nsfetchedresultscontroller