我在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委托方法停止接收数据。有什么帮助吗?
答案 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。