Core Data executeFetchRequest throws NSGenericException (Collection was mutated while being enumerated)

后端 未结 4 1534
忘掉有多难
忘掉有多难 2021-02-09 13:04

I\'m developing a iPhone app with Core Data. All user data should be synchronized with our servers. For this purpose I created a subclass of NSOperation witch loads new data fro

4条回答
  •  遥遥无期
    2021-02-09 13:23

    The error "someCollection was mutated while being enumerated" is caused by altering a mutable collection i.e. array, dictionary, set etc, while an enumerator is stepping through it. Since you can't enumerate a moving target, this triggers an error.

    In this case, the error is most likely caused by trying to enumerate a Department's employees relationship on the main thread e.g. for display in a tableview, while the the background thread is simultaneously adding employees to the relationship.

    Did work around this, you have to freeze the UI while you merge the changes from the background thread. For tableviews, a fetched results controller (NSFetchedResultsController) with properly implemented delegate methods in the tableview controller will handle the problem nicely.

    The important thing is to send beginUpdates to the tableview before you merge the new data. This will tell the table that it's underlying data structure is being mutated so it won't try to redraw itself. When the merge is complete, send endUpdates to the tableview to cause it to display the new information.

提交回复
热议问题