读取 系统通讯录的时候,加载很慢。
代码如下:/**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 的时候,会消耗时间嘛?
代码如下:/**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 的时候,会消耗时间嘛?
一般io操作都放到后台线程里去做,避免阻塞主线程,当然读写时间并不会少,但用户体验会比较好
我这个是在 其他线程里弄的,不过花费时间要20秒左右。数据大概 1700个- -!我想缩短到10秒-15秒。因为其他的app实现了,而且只要了8秒,我就想优化下。不过还是谢谢你了