2016-09-21 27 views
34

我升級了我的項目到Xcode 8.現在,我得到了Xcode 8和iOS 10組合的錯誤日誌。(NSFetchedResultsController):無法讀取緩存文件來更新存儲信息時間戳

在下面的代碼中將cacheName設置爲nil似乎可以修復它。

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:NULL cacheName:@"myCache"]; 

我該如何擺脫這個錯誤日誌並在我的FRC中使用緩存?

+0

如果你想這個模擬器上,那麼,你可以嘗試通過將模擬其重置 - >重置內容和設置。另外,清理項目。 –

+0

試過。沒有幫助:( – iCanCode

+1

在升級到Xcode 8/iOS 10後也看到了真實設備上的錯誤。 – jk7

回答

25

這個錯誤不應該被忽略,因爲它會導致應用程序崩潰。它與文件描述符泄漏的iOS 10錯誤有關。有關於openradar和Apple Bug Reporter的報道。

會發生什麼情況:如果使用NSFetchedResultsController和非零緩存名加載視圖控制器,則每次保存託管對象上下文時,都會打開一個或多個指向fetchedResultsController的sectionInfo緩存文件的文件描述符。這意味着如果您將上下文保存255次,您將達到設備上可以打開的最大文件數量,並且不會打開任何新資源,從而導致隨後打開的xib文件,圖像,數據庫等失敗。

也會發生已經生產上的設備升級到iOS 10.

臨時溶液禁用NSFetchedResultsController緩存以零作爲cacheName應用程序(與xcode中7內置)的問題:

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:NULL cacheName:nil]; 

顯然這樣我們就無法獲得緩存的優勢。我希望蘋果能儘快解決這個問題。我要再次進行測試10.2測試版1

OPEN RADAR 28361550

編輯 在iOS 10.2 Beta 1中不發生錯誤:它已經解決了(現在)。

+4

我不能保證它是同一個問題,但是我仍然在真實設備上看到iOS 10.2中的這個錯誤。從我的FRC中刪除緩存解決了這個問題,所以我懷疑這個問題是相關的。 – user3847320

+0

這是正確的解決方案爲了我。 –

1

我在這裏提供了一個答案,但在這裏第一次去...

我經歷了這個錯誤,並已經找到了我的具體情況的分辨率。我正在使用NSFetchedResultsController。然後我回去添加國家恢復。這個錯誤然後在恢復時開始出現。當我使用導航欄返回到先前的視圖控制器時,數據全部丟失/不正確。

在讀NSFetchedResultsController文檔,我發現了以下內容:

重要

委託必須實現的改變跟蹤委託的至少一個方法,以便更改跟蹤啓用。提供空的執行controllerDidChangeContent(_:)就足夠了。

我簡單地按照指示實施了一個空的controllerDidChangeContent(_:)。現在,一切正常,問題的錯誤信息消失了。要清楚,我只是簡單地添加在每個視圖控制器下面的代碼以獲取結果控制器:

// NSFetchedResultsController change tracking methods 
    func controllerDidChangeContent(_ controller: 
NSFetchedResultsController<NSFetchRequestResult>) { 
     // empty: see documentation 
    } 

希望這有助於。

0

更多關注上述錯誤信息後,我可以看到您的應用程序正在創建大量的文件描述符,在緩存文件夾中打開文件並且從不關閉或釋放它們。 因此,現在最好禁用NSFetchedResultsController緩存。

希望蘋果會解決這個問題

相關問題