前面的两课都是在主线程进行的操作,当数据不是很多的时候,问题还不是很大,但是,当一次性存储多条数据或则查询多条数据的时候,就会造成APP卡顿。所以,我们就想到要在子线程进行操作。
异步线程查询
- (IBAction)asynRequestion:(id)sender {
dispatch_async(dispatch_get_main_queue(), ^{
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
context.persistentStoreCoordinator = self.context.persistentStoreCoordinator;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
NSArray *arr = [context executeFetchRequest:request error:nil];
for (Person *p in arr) {
NSLog(@"name=%@, age=%lld", p.name, p.age);
}
});
}
多线程操作CoreData
- 1.为每一个线程创建一个独立的NSManagedObjectContext对象
- 2.多个NSManagedObjectContext对象可以共用一个NSPersistentStoreCoordinator对象
- 3.多线程修改MO数据之后,应该将修改的数据同步合并到主线程的NSManagedObjectContext对象中。
我们需要定义一个通知
// 监听所有NSManagedObjectContext保存事件
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:nil];
然后实现contextDidSave方法
- (void)contextDidSave:(NSNotification *)notification
{
// 主线程修改的,不需要合并
NSManagedObjectContext *context = notification.object;
if (context == self.context) {
return;
}
// 将子线程中context中的MO合并到主线程的context
[context mergeChangesFromContextDidSaveNotification:notification];
}
但是在分页查询的时候,他们会根据条数进行查询,不会一次查询全部。如果你分页的数据不是很多,可以不用放到子线程
- (IBAction)pageSearchData:(id)sender {
if (self.dataArray.count == 0) {
self.page = 0;
} else {
self.page++;
}
// dispatch_async(dispatch_get_main_queue(), ^{
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
NSPersistentStoreCoordinator *store = self.context.persistentStoreCoordinator;
context.persistentStoreCoordinator = store;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
// 分页查询
// 起始索引,就是从哪个位置开始查
request.fetchOffset = self.page * self.limit;
// 分页的条数
request.fetchLimit = self.limit;
NSArray *arr = [context executeFetchRequest:request error:nil];
for (Person *p in arr) {
NSLog(@"name=%@, age=%lld", p.name, p.age);
}
[self.dataArray addObjectsFromArray:arr];
// });
}
网友评论