如何在等待图像加载时停止程序

时间:2013-08-30 08:43:12

标签: ios objective-c sleep

你如何阻止程序执行?不睡觉功能吗?如果是的话,这段代码出了什么问题:

AsyncImageView *tmpImage = [imagesArray objectAtIndex:index];

int waitCounter = 0;
while (waitCounter < 10 && !tmpImage.imageIsLoaded) {
    waitCounter++;
    sleep(0.5);
}
NSLog(@"%i",waitCounter);
if (tmpImage.imageIsLoaded) {
    return [tmpImage image];
} else {
    return [UIImage imageNamed:@"img_noimg.png"];
}

AsyncImageView类从URL加载图像,然后将imageIsLoaded属性设置为true。这通常发生得非常快(在一秒钟之内),但如果我像疯子一样滚动图像,那么它没有时间加载(它前面加载了10张图像)。

我添加了while以防止这种情况发生,但是日志显示waitCounter的多个case为10而没有睡眠时间(接口没有冻结)。

3 个答案:

答案 0 :(得分:1)

解决此类问题的一种方法是使用完成处理程序。异步任务完成时,完成处理程序会向调用站点发出信号,并将任务结果作为参数传递给完成处理程序。

你的AsyncImageView类确实有这样的完成处理程序。这是一个选择器。今天,人们会使用一个块。但原则是一样的。

异步任务完成后继续称为“继续”。使用块,您的代码如下所示:

typedef void (^completion_handler_block)(id result);

void doSomethingAsync(completion_handler_block)completionHandler;

- (void) foo {

    doSomethingAsync(^(id result) {
        // Continuation code
        ...
    });

}

使用块实现continuation特别容易,因为它保持了块(闭包)中的上下文(在调用站点中定义的引用变量)。

答案 1 :(得分:0)

你在做什么?在方法 cellForRowAtIndexPath

如果是这样,你一定不能在这里睡觉。

要异步加载图像,必须

1)将真正的UIImageView传递给AsyncImageView和

2)当您从URL加载UIImage时,而不是设置* _imageIsLoaded = TRUE *,您可以使用* _imageView.image = image *

直接在传递的UIImageView中加载它

例如,您可以执行类似的操作,考虑到您可能已经加载了图像等。在AsyncImageView中创建此方法,如下所示

-(void) reloadWithImageView:(UIImageView*)imageView {
    _imageView = imageView;
}

以后加载UIImage时(可能在 connectionDidFinishLoading 方法中)

- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection {
    connection = nil;

    UIImage *image = [UIImage imageWithData:data];
    _imageView.image = image;
}

答案 2 :(得分:-1)

试试这个,我猜它会起作用。而不是

sleep(0.5);

尝试

[NSThread sleepForTimeInterval:.5f];