2013-08-30 51 views
0

如何让程序停止执行?不睡觉功能吗?如果是这样,什么是错,此代码:如何在等待图像加载时暂停程序

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为10的情况。

+2

相反的(只是)设置属性'imageIsLoaded'接收数据的方法可以调用的委托方法代码sniplet所属的类。然后这将相应地设置图像。滥用睡眠功能不是一个好主意。 –

+1

使用名为“Async”的类并在Async请求完成时调用sleep ...哇!不是最好的,甚至不是好主意! 您可以阅读关于ios委托或关于通知中心的更多信息。 (我更喜欢代表) –

+0

嗯......我宁愿不想深入了解代码,然后才需要它。我已经觉得在调试这个代码的其他部分(我正在管理一个项目,其中的代码是在2010年编写的)中跳出窗口10次... –

回答

-1

试试这个,我猜它会起作用。取而代之的

sleep(0.5); 

尝试

[NSThread sleepForTimeInterval:.5f]; 
+0

这就是我想要的,只是不是我想要的方式:) –

1

一种方法来解决问题这样是使用完成处理程序。完成处理程序在异步任务完成时向呼叫站点发出信号,并将任务结果作为参数传递给完成处理程序。

您的AsyncImageView类确实有这样一个完成处理程序。这是一个选择器。今天,人们会用块代替。虽然原理是一样的。

异步任务完成后继续执行称为“继续”。随着块,你的代码如下所示:

typedef void (^completion_handler_block)(id result); 

void doSomethingAsync(completion_handler_block)completionHandler; 

- (void) foo { 

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

} 

与实施连续块是特别容易,因为它保持块(关闭)内的情况下(在调用点定义的参考变量)。

0

你在做什么?在方法cellForRowAtIndexPath

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

对于加载图像异步必须

1)通过真正的UIImageView您AsyncImageView和

2)当您从URL加载UIImage的,而不是set * _imageIsLoaded = TRUE *,你可以直接在传递的UIImageView中使用* _imageView.image = image *

例如,你可以做这样的事情,考虑到你可能已经加载了图像等。在AsyncImageView中创建这个方法,像这样

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

,并在以后加载的UIImage(可能在connectionDidFinishLoading法)

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

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