读取 系统通讯录的时候,加载很慢。
代码如下:/**write datas*/
- (void)generatePersonInfosFromAddressBook:(ABAddressBookRef)addressBook {
    
    CFArrayRef persons = ABAddressBookCopyArrayOfAllPeople(addressBook);
    CFIndex nCounts = ABAddressBookGetPersonCount(addressBook);
    
    //database
    ILSCMPersistenceManage *pm = [ILSCMPersistenceManage sharedInstance];
    
    for (int i = 0; i<nCounts; i++) {
        ABRecordRef recordOfPerson = CFArrayGetValueAtIndex(persons, i);
        ABContact *contact = [ABContact contactWithRecord:recordOfPerson];
        ILSCMPersonInfo *personInfo = [ILSCMPersonInfo ABcontactCoventToPersonInfo:contact];
        
        if (personInfo.recordID) {
            NSString *regex = [NSString stringWithFormat:@"SELF.recordID == %d",[personInfo.recordID intValue]];
            NSArray *result = [pm fetchEntity:kEntityPersonInfo criteria:regex variables:nil sortBy:nil ascending:YES];
            if ([result count]!=0) {
                NSManagedObject *obj    = [result objectAtIndex:0];
                NSDate *coreDataModify  = [obj valueForKey:@"modificationDate"];
                NSDate *constactModify  = personInfo.modificationDate;
                
                switch ([coreDataModify compare:constactModify]) {
                    case NSOrderedAscending:
                    {   //update
                        personInfo.objectId =[[obj.objectID copy] autorelease];
                        [pm savePersonInfo:personInfo];
                        break;
                    }
                    default:
                        break;
                }
            }else {
//                [pm savePersonInfo:personInfo];
            }
        }else {
            NSLog(@"refRecordId  is nul");
        }
        
        //commit
//        [pm commitEventWithEachCount:i+1];
    }
    //保存不足30的余数
    [pm commitEventWithEachCount:0];
    
    //release persons
    CFAutorelease(persons);
}
有木有什么办法 缩短这些时间,我测试出来的时间是18秒多。很纠结,我注释掉了 写入操作,但是还是要17秒多。
save操作也注释掉了,也要17秒。
希望有人可以帮我看看 要怎么改进,或者有什么新的 想法,也可以说说。谢谢了。补充:上面的代码,主要是 for 循环,里面没什么计算的操作,难道是内存 alloc 的时候,会消耗时间嘛?

解决方案 »

  1.   

    应该还是io操作费时间,但似乎也不会那么长吧.再详细打印看看
    一般io操作都放到后台线程里去做,避免阻塞主线程,当然读写时间并不会少,但用户体验会比较好
      

  2.   

    你可以用shark测试一下,哪个代码块运行的效率最低,即用了最长的时间。
      

  3.   


    我这个是在 其他线程里弄的,不过花费时间要20秒左右。数据大概 1700个- -!我想缩短到10秒-15秒。因为其他的app实现了,而且只要了8秒,我就想优化下。不过还是谢谢你了