performBlock:
You use this method to send messages to managed objects if the context was initialized using NSPrivateQueueConcurrencyType or NSMainQueueConcurrencyType.
This method encapsulates an autorelease pool and a call to processPendingChanges.
performBlockAndWait:
You use this method to send messages to managed objects if the context was initialized using NSPrivateQueueConcurrencyType or NSMainQueueConcurrencyType.
This method may safely be called reentrantly.
注意最后一句,苹果申明了这个函数是可以安全的递归调用的.
processPendingChanges:
This method causes changes to registered managed objects to be recorded with the undo manager.
In AppKit-based applications, this method is invoked automatically at least once during the event loop (at the end of the loop)—it may be called more often than that if the framework needs to coalesce your changes before doing something else. You can also invoke it manually to coalesce any pending unprocessed changes.
processPendingChanges改变当前对象的状态图;
processPendingChanges类似于告诉字处理器在文档的编辑后更新它的内部状态,但不保存到磁盘。多用于用户界面上 更新数据;
processPendingChanges常用在单独线程上运行多个上下文;
save保存到磁盘;
调用save将自动调用processPendingChanges;
在我们保存数据到数据库的时候常用 save方法;
错误案例1:
在performBlockAndWait代码块中刷新UI,UI 有时不正确,UI 数据源是来自有关block块中的NSManageObject对象
原因就是因为虽然在block中修改了数据源的值,但是并未及时保存,代码块执行完成之后才调用processPendingChanges: 方法.
[_contextToSetMetadata performBlockAndWait:^{
//logic code ....
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:kNotifyRefreshUI object:nil];
});
}];