在UIScrollView中更新UIImageView - 图像在滚动时冻结

时间:2012-03-06 17:58:47

标签: iphone uiscrollview uiimageview freeze nsurlrequest

我在UIScrollView中有UIImageView。 UIImageView显示从互联网上不断下载的图像(使用NSURLConnection打开的流)。

NSString surl = @"some valid url";
NSURL* nsurl = [NSURL URLWithString:surl];
NSURLRequest *request = [NSURLRequest requestWithURL:nsurl];
[[NSURLConnection alloc] initWithRequest:request delegate:self];

// this method will be called when every chunk of data is received
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // here I collect data and when i have enough
    // data to create UIImage i create one
}

每次我收到数据时都会将其打包成NSData,当我收到整个图像时,我会从这个NSData创建UIImage然后将此图像设置为UIImageView的图像。一切正常,图像更新,但当我触摸屏幕并开始移动内容时(此UIImageView总是大于屏幕,UIScrollView始终适合整个屏幕)图像更新停止,我只看到显示在屏幕上的最后一帧我点击的时间。这似乎发生了,因为我的

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

停止被叫。从屏幕释放手指后,方法再次接收数据和图像更新。我不知道为什么我的NSURLConnection委托方法停止接收数据。有什么帮助吗?

2 个答案:

答案 0 :(得分:4)

-[NSURLConnection initWithRequest:didReceiveData:]的文档说明了这一点:

  

默认情况下,为了使连接正常工作,调用线程的运行循环必须在默认的运行循环模式下运行。

我假设您正在主线程上创建NSURLConnection

UIScrollView跟踪触摸时,它会以不同模式运行运行循环,而不是默认模式。这就是您在触摸滚动视图时停止获取更新的原因。 (这也会导致NSTimer在您触摸滚动视图时停止射击。)

我认为您可以将NSURLConnection设置为在默认模式和滚动视图跟踪模式下运行,如下所示:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
    delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode: NSRunLoopCommonModes];
[connection start];

答案 1 :(得分:0)

听起来您的用户交互阻止了您的数据更新,因为它们都在主线程上运行。我不久前碰巧回复了一对very similar question