for(NSlictionary * detailsDict in rsltArray) { NSString * OfficeId = [detailsDict objectForKey:@“ObjectId”]; NSString * catID = [detailsDict objectForKey:@“catID”]; NSString * ObjType = [detailsDict objectForKey:@“ObjectType”];
NSString *getImage = [NSString stringWithFormat:@"select catMarkericon from TBL_Category where catID='%@'",catID];
NSMutableArray * imageArray = [self.database getDataListBySQLQueryStatement:getImage];
NSString *officeLogo = [[imageArray objectAtIndex:0] objectForKey:@"catMarkericon"];
NSArray *parts = [officeLogo componentsSeparatedByString:@"/"];
NSString *filename = [parts lastObject];
NSString *OfficeName;
NSString *OfficeAddress;
if([[UserDefaults getLanguageSelection]isEqualToString:@"en"])
{
OfficeName =[detailsDict objectForKey:@"ObjectNameEnglish"];
OfficeAddress =[detailsDict objectForKey:@"ObjectAddressEnglish"];
}
else
{
OfficeName =[detailsDict objectForKey:@"ObjectNameArabic"];
OfficeAddress =[detailsDict objectForKey:@"ObjectAddressArabic"];
}
double Off_lat =[[detailsDict objectForKey:@"Latitude"] doubleValue];
double Off_long =[[detailsDict objectForKey:@"Longitude"] doubleValue];
tempLocation = [[CLLocation alloc] initWithLatitude:Off_lat longitude:Off_long];
CLLocationDistance meters = [tempLocation distanceFromLocation:CurrentLoc]/1000;
if(meters<=Dist)
{
[arrListdata addObject:detailsDict];
if ([catID isEqualToString:selectID]) {
tempCoordinate = [ARGeoMarkerco coordinateWithLocation:tempLocation locationTitle:OfficeName withid:OfficeId withaddress:OfficeAddress withimage:filename withcatId:catID withObjType:ObjType selectValue:YES newmarker:NO];
[locationArray addObject:tempCoordinate];
}
else{
tempCoordinate = [ARGeoMarkerco coordinateWithLocation:tempLocation locationTitle:OfficeName withid:OfficeId withaddress:OfficeAddress withimage:filename withcatId:catID withObjType:ObjType selectValue:NO newmarker:NO];
[locationArray addObject:tempCoordinate];
}
}
}
我正在使用这样的循环,我必须迭代超过1500个数据,它会让我的应用程序卡住4到7秒,无论如何解决这个问题
答案 0 :(得分:-1)
我必须用Objective C / pseudocode hybrid写这个,只是为了尽可能快地给你一个答案。
将1500个成员数组拆分为2个。
NSRange theRange;
NSRange theSecondRange;
theRange.location = 0;
theRange.length = 749;
theSecondRange.location = 750;
theSecondRange.length = 750;
NSArray *array1 = [rsltArray subarrayWithRange:theRange];
NSArray *array2 = [rsltArray subarrayWithRange:theSecondRange];
然后,在后台创建2个调度队列。使用您拥有的代码将第一个数组在第一个队列中线程化。对第二个做同样的事情。线程完成后,使用NSArray arrayByAddingObjectsFromArray
将它们放在一起。
如果它仍然太慢,请将数组进一步拆分为4或8,然后将它们分成不同的队列。诀窍是你必须等待添加它们,直到线程返回,否则你的应用程序将崩溃,因为没有一个数组可以添加回一个主阵列。 更新在Apple上关于Grand Central Dispatch中的调度组的链接,以处理我提到的关于子阵列何时返回的情况https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html#//apple_ref/doc/uid/TP40008079-CH2-SW19