我是iOS开发中的新手。我对dispatch_get_main_queue()
一无所知,所以我希望从我的服务器图像网址中获取图像大小,如
首先,我解析我的JSON数据并获取图像大小,如
[self.feedArray addObjectsFromArray:[pNotification.userInfo valueForKey:@"items"]];
[self fillHeightArray];
在这里,我在我的self.feedArray
中设置解析数据,然后我得到像
-(void)fillHeightArray
{
NSMutableArray *requestArray=[[NSMutableArray alloc]init];
NSMutableArray *dataArray=[[NSMutableArray alloc]init];
for (int i=0; i<[self.feedArray count];i++)
{
NSString *urlString = [[self.feedArray objectAtIndex:i]valueForKey:@"photo"];
NSURL *imageFileURL = [NSURL URLWithString:urlString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:imageFileURL];
[requestArray addObject:urlRequest];
}
dispatch_queue_t callerQueue = dispatch_get_main_queue();
dispatch_queue_t downloadQueue = dispatch_queue_create("Lots of requests", NULL);
dispatch_async(downloadQueue, ^{
for (NSURLRequest *request in requestArray) {
[dataArray addObject:[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]];
}
dispatch_async(callerQueue, ^{
for (int i=0; i<[dataArray count]; i++)
{
UIImage *imagemain=[UIImage imageWithData:[dataArray objectAtIndex:i]];
UIImage *compimage =[self resizeImage:imagemain resizeSize:CGSizeMake(screenWidth/2-16,180)];
CGSize size = CGSizeMake(screenWidth/2-16,compimage.size.height);
[self.cellHeights addObject:[NSValue valueWithCGSize:size]];
}
[GlobalClass StopSpinner:self.view];
self.cltItem.hidden=FALSE;
[self.cltItem reloadData];
[self.cltItem.collectionViewLayout invalidateLayout];
[[NSUserDefaults standardUserDefaults]setValue:@"1" forKey:Loading];
});
});
}
像
那样调整我的图片大小-(UIImage *)resizeImage:(UIImage *)orginalImage resizeSize:(CGSize)size
{
float oldWidth = orginalImage.size.width;
float scaleFactor = size.width / oldWidth;
float newHeight = orginalImage.size.height * scaleFactor;
float newWidth = oldWidth * scaleFactor;
UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
[orginalImage drawInRect:CGRectMake(0,0,newWidth,newHeight)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
所以,从这段代码我第一次得到了很好的结果,但是当我想加载更多的数据,所以这段代码第二次运行,然后我没有有效的图像大小
我不明白那里有什么问题,但我想我的
dispatch_queue_t callerQueue = dispatch_get_main_queue();
dispatch_queue_t downloadQueue = dispatch_queue_create("Lots of requests", NULL);
加载更多数据时出现问题。
请帮助我。
答案 0 :(得分:1)
您总是在此行中添加对象:
[self.cellHeights addObject:[NSValue valueWithCGSize:size]];
当您第二次运行代码时,数组变大,旧值仍然存在于其开头。这可能会在第二次运行代码时给你带来不好的结果。
编辑:
它可能工作得更慢,因为你已经做了一些保留周期/有内存泄漏。在这种情况下,它将在第一次正常工作,并且每次额外运行都会更慢。除了self.cellHeights表之外,我还没有看到你的代码有什么问题。检查程序的其余部分是否每次都变大,并确保不再使用的对象被释放。
另外,请尝试使用&#39; build&amp;分析&#39; [ALT + CMD + B]。这可能会引发一些内存泄漏或其他问题。
分析工具在定位泄漏方面也非常有效,您可以使用键盘上的[CMD + I]访问它们。
您可以尝试的另一件事是直接调用main_queue,例如:
dispatch_async(dispatch_get_main_queue(), ^(void) {
//do sth
});
您将避免创建另一个对象,并且您只在整个代码段中使用main_queue一次。
尝试这样做,如果你有任何东西,请告诉我。