簡體   English   中英

當返回的object也可能從持久化存儲中刪除時,fetchedResultsController返回的故障對象如何處理

[英]How to deal with faulted objects returned by fetchedResultsController when the returned object may also be deleted from the persistent store

  1. 在我的簡單實驗中,fetchedResultsController 似乎沒有返回錯誤對象。 fetchedResultsController 是否可以為特定索引路徑返回有故障的核心數據 object?
  2. 下面的示例代碼在主線程上運行。 假設在“點 A”,后台線程刪除並保存到持久存儲 object 剛剛由獲取的結果 controller 返回。 現在,當我們嘗試訪問dataObject上的屬性時,我們會崩潰,因為由於數據已從持久存儲中刪除,因此無法完成故障。
  3. 我看到的一件事是,這種關系更有可能出現問題。 因此,在“A 點”,可以說父 object 已從持久存儲中刪除。 然后,當嘗試訪問父級上的 name 屬性時,將發生錯誤,因為無法完成故障。
  4. 防止此類問題的最佳方法是什么?

示例代碼:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = code_for_cell_reuse_here;

    PersonModelObject *dataObject = (PersonModelObject *)[self.fetchedResultsController objectAtIndexPath:indexPath];

        /* Point A */

    cell.textLabel.text = dataObject.name;
    cell.detailTextLabel.text = dataObject.parent.name;

    return cell; 
}

您需要注意來自其他線程的 NSManagedObjectContextDidSaveNotification 並刷新您的上下文。

這可以同步完成,通過使用 performSelectorOnMainThread 或使用塊阻塞主線程更新來避免競爭條件。

You can then either manually, or using refreshFromContextDidSaveNotification:mergeChanges: update your local managed object context, but if the volume of data is sufficiently large it might be easiest to just call -reset on the managed object context and -performFetch on the fetched results controller .

要回答您問題的另一個方面(希望更有用), NSFetchedResultsController應該返回故障對象(即已加載的屬性),並且您可以使用NSFetchRequest.relationshipKeyPathsForPrefetching來預先獲取故障關系。

-[NSManagedObject isDeleted]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM