dispatch_get_main_queue()无法正常运行

时间:2015-09-23 12:26:04

标签: ios background grand-central-dispatch

我是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);

加载更多数据时出现问题。

请帮助我。

1 个答案:

答案 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一次。

尝试这样做,如果你有任何东西,请告诉我。