dispatch_get_main_queue() 不是 运行 完美
dispatch_get_main_queue() not running perfect well
我是 iOS 开发的新手。我对 dispatch_get_main_queue()
一无所知,所以我想从我的服务器图像 url 中获取图像大小,如
首先,我解析我的 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);
加载更多数据时出现问题。
请帮助我。
您总是在这一行中添加对象:
[self.cellHeights addObject:[NSValue valueWithCGSize:size]];
当您第二次 运行 代码时,数组变大,旧值仍然存在于它的开头。当 运行 第二次调用代码时,这可能会给您带来不好的结果。
编辑:
它可能会工作得更慢,因为你做了一些保留周期/有内存泄漏。在这种情况下,第一次它会工作正常,每增加一个 运行 就会变慢。除了 self.cellHeights table 增长之外,我真的没有发现您的代码有任何问题。每次检查变大的元素的其余过程,并确保不再使用的对象被释放。
此外,尝试使用 'build & analyze' [ALT + CMD + B]。这可能会指出一些内存泄漏或其他问题。
分析工具在定位泄漏方面也非常有效,您可以使用键盘上的 [CMD + I] 访问它们。
您可以尝试的另一件事是直接调用 main_queue,例如:
dispatch_async(dispatch_get_main_queue(), ^(void) {
//do sth
});
您将避免创建另一个对象,而且您在整个代码段中只使用一次 main_queue。
尝试这样做,如果你有任何发现,请告诉我。
我是 iOS 开发的新手。我对 dispatch_get_main_queue()
一无所知,所以我想从我的服务器图像 url 中获取图像大小,如
首先,我解析我的 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);
加载更多数据时出现问题。
请帮助我。
您总是在这一行中添加对象:
[self.cellHeights addObject:[NSValue valueWithCGSize:size]];
当您第二次 运行 代码时,数组变大,旧值仍然存在于它的开头。当 运行 第二次调用代码时,这可能会给您带来不好的结果。
编辑:
它可能会工作得更慢,因为你做了一些保留周期/有内存泄漏。在这种情况下,第一次它会工作正常,每增加一个 运行 就会变慢。除了 self.cellHeights table 增长之外,我真的没有发现您的代码有任何问题。每次检查变大的元素的其余过程,并确保不再使用的对象被释放。
此外,尝试使用 'build & analyze' [ALT + CMD + B]。这可能会指出一些内存泄漏或其他问题。
分析工具在定位泄漏方面也非常有效,您可以使用键盘上的 [CMD + I] 访问它们。
您可以尝试的另一件事是直接调用 main_queue,例如:
dispatch_async(dispatch_get_main_queue(), ^(void) {
//do sth
});
您将避免创建另一个对象,而且您在整个代码段中只使用一次 main_queue。
尝试这样做,如果你有任何发现,请告诉我。