Coredata开发之MagicalRecord

05/12/2015 22:50 下午 posted in  apple
  1. 线程的创建
    先看两则代码:
    代码1:
    for (NSString *feedID in self.feedsToRemove) {
        [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
            [Feed MR_deleteAllMatchingPredicate:[NSPredicate predicateWithFormat:@“uid = %@“,feedID]];
        } completion:^(BOOL contextDidSave, NSError *error) {
            
        }];
    }

代码2:

    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        for (NSString *feedID in self.feedsToRemove) {
            [Feed MR_deleteAllMatchingPredicate:[NSPredicate predicateWithFormat:@“uid = %@“,feedID]];
        }
    } completion:^(BOOL contextDidSave, NSError *error) {
        
    }];

代码1是错误的,因为会产生严重的线程问题,导致CPU居高不下,UI僵死等,
为什么呢?我们可以这样理解:MagicalRecord 的这个saveWithBlock方法,其实是创建一个子线程来处理数据事务,于是 当self.feedsToRemove有N个对象 那么就会产生N个线程,当然 对于一个设备来说线程总有一个最高数限制,直到把所有线程用光,于是乎整个世界就全被线程塞满了,卡死。。。

所以我们采用代码2中的写法,将枚举写如子线程中。

PS:这样的问题其实就是错误使用线程创建导致,还是自己马虎啊。。切记。