Core Data 异步查询(iOS 8 特性)
2015-12-01 16:35
501 查看
如同很多其他 iOS 上的需求一样,当复杂且耗时长的工作放在主线程上,会造成线程阻塞,这个时候 UI 会处于一种假死的状态。同样的 Core Data 的 Fetch 也是一样的,在 Fetch 条件复杂、数据量很大的情况下,同样会造成线程阻塞。这个时候,这部分工作就应该异步执行。
Core Data 的异步执行被封装的相当简单,在已有的 FetchRequest 的基础上,使用
首先在模块原有的 FetchRequest 中模块中添加 iVar 变量:
NSAsynchronousFetchRequest 就像是已经存在的 FetchRequest 的一个 Wrapper 一样。创建一个
执行请求的时候类似,不过请求的方法从
执行请求之后,返回的数据为:
调用的方法如下:
block 之内是对返回的数据做处理。
另外,如果要取消正在,asyncFetchRequest 可以调用 cancel() 方法来取消这次异步请求。
经典的案例是电子邮箱类似的APP中
iOS 8 发布了支持
NSBatchUpdateRequest 实现的原理是完全绕开了 NSManagedObjectContext,直接去 NSPersistentStore 层去做 Update。
在初始化的时候配置好EntityName, 配置影响的property和更改的值 以及 配置影响的Store,以及返回Result的数据类型。
另外提一下:如同这种在 Store 层的数据更新,数据删除也有同样的API,在 iOS 9 的时候苹果提供了一个类似 NSBatchUpdateRequest 的类来做在 Store 层的数据删除,使用 —-
注意:
额外需要注意的一点是,前面提到了「NSBatchUpdateRequest 实现的原理是完全绕开了 NSManagedObjectContext,直接去 NSPersistentStore 层去做 Update。」
所以做了批量 Update / Delete 之后,你之前请求的那部分数据已经失效了,因为它们跟数据库已经失去了同步性。
Core Data 的异步执行被封装的相当简单,在已有的 FetchRequest 的基础上,使用
NSAsynchronousFetchRequest来实现异步请求。
NSAsynchronousFetchRequest的命名容易让人产生歧义,其实它并不是 FetchRequest 的 subclass,它跟 FetchRequest 一样,同样是
NSPersistentStoreRequest的子类。也就是说实现异步的 Fetch 就是把
NSFetchRequest替换为
NSAsynchronousFetchRequest。
首先在模块原有的 FetchRequest 中模块中添加 iVar 变量:
var asyncFetchRequest: NSAsynchronousFetchRequest!
NSAsynchronousFetchRequest 就像是已经存在的 FetchRequest 的一个 Wrapper 一样。创建一个
NSAsynchronousFetchRequest需要一个正常的 FetchRequest 和一个 Completion Handle。
执行请求的时候类似,不过请求的方法从
executeFetchRequest变成了
executeRequest,传递进去的参数也从 FetchRequest 变成了 AsynchronousFetchRequest。
执行请求之后,返回的数据为:
NSAsynchronousFetchResult。
调用的方法如下:
fetchRequest = NSFetchRequest(entityName: "Venue") asyncFetchRequest = NSAsynchronousFetchRequest(fetchRequest: fetchRequest) { //查询成功的处理 [unowned self] (result: NSAsynchronousFetchResult!) -> Void in self.venues = result.finalResult as! [Venue] self.tableView.reloadData() } do { try coreDataStack.context.executeRequest(asyncFetchRequest) //Returns immediately, cancel here if you want. } catch let error as NSError { print("Could not fetch \(error), \(error.userInfo)") }
block 之内是对返回的数据做处理。
另外,如果要取消正在,asyncFetchRequest 可以调用 cancel() 方法来取消这次异步请求。
批量更新(不做查询,直接在Store层进行更新,iOS 8 的特性)
举例一种情况,如果我们要对十万条数据都进行同样的一个属性的更新,一般的做法我们需要取出这十万条数据,我们取出十多万条数据只是为了做一个很简单的更新。经典的案例是电子邮箱类似的APP中
标记所有邮件为已读这样的需求,难道要把上千封邮件全部请求出来吗,显然不是。
iOS 8 发布了支持
批量更新(Bench Update)的
NSBatchUpdateRequest,使用它可以在不做查询的情况下更新数据。
NSBatchUpdateRequest 实现的原理是完全绕开了 NSManagedObjectContext,直接去 NSPersistentStore 层去做 Update。
//这四行代码,在初始化的时候配置好EntityName, 配置影响的property和更改的值 以及 配置影响的Store,以及返回Result的数据类型。 //创建NSBatchUpdateRequest 的实例,entityName 作为初始化参数。 let batchUpdate = NSBatchUpdateRequest(entityName: "myEntityName") //标明需要 Update 的 property 和 值 batchUpdate.propertiesToUpdate = ["favorite" : NSNumber(bool: true)] //被影响的Stores 默认情况下这么写就可以,如果涉及比较多的PersistentStores 情况就更复杂了。 batchUpdate.affectedStores = coreDataStack.context.persistentStoreCoordinator!.persistentStores //配置返回数据的类型,还可以是 UpdatedObjectIDsResultType。 batchUpdate.resultType = .UpdatedObjectsCountResultType //执行批量更新 do { let batchResult = try coreDataStack.context.executeRequest(batchUpdate) as! NSBatchUpdateResult print("Records updated \(batchResult.result!)") } catch let error as NSError { print("Could not update \(error), \(error.userInfo)") }
在初始化的时候配置好EntityName, 配置影响的property和更改的值 以及 配置影响的Store,以及返回Result的数据类型。
另外提一下:如同这种在 Store 层的数据更新,数据删除也有同样的API,在 iOS 9 的时候苹果提供了一个类似 NSBatchUpdateRequest 的类来做在 Store 层的数据删除,使用 —-
NSBatchDeleteRequest,同样它们两个都是
NSPersistentStoreRequest的子类。
注意:
额外需要注意的一点是,前面提到了「NSBatchUpdateRequest 实现的原理是完全绕开了 NSManagedObjectContext,直接去 NSPersistentStore 层去做 Update。」
所以做了批量 Update / Delete 之后,你之前请求的那部分数据已经失效了,因为它们跟数据库已经失去了同步性。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- iOS开发之路--微博“更多”页面
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- 分享一个iOS下实现基本绘画板功能的简单方法