CoreData第三课-多线程操作CoreData

前面的两课都是在主线程进行的操作,当数据不是很多的时候,问题还不是很大,但是,当一次性存储多条数据或则查询多条数据的时候,就会造成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];
//    });
}

你可能感兴趣的:(CoreData第三课-多线程操作CoreData)