【发布时间】:2011-05-04 16:38:51
【问题描述】:
我有一个问题,我试图在用户在 UIScrollView 周围移动时在后台加载声音文件...问题是我正在使用 NSURLRequest 所以我可以在后台加载,但即使那样它也拒绝实际加载直到 UIScrollView 停止滚动。 :(
对此我有什么办法吗?
谢谢!
【问题讨论】:
标签: objective-c ipad ios uiscrollview nsurlrequest
我有一个问题,我试图在用户在 UIScrollView 周围移动时在后台加载声音文件...问题是我正在使用 NSURLRequest 所以我可以在后台加载,但即使那样它也拒绝实际加载直到 UIScrollView 停止滚动。 :(
对此我有什么办法吗?
谢谢!
【问题讨论】:
标签: objective-c ipad ios uiscrollview nsurlrequest
NSURLRequest 只管理请求,而不是实际连接。
滚动等触摸事件会将运行循环放入NSEventTrackingRunLoopMode。默认情况下,NSURLConnection 计划仅在NSDefaultRunLoopMode 中执行。所以在NSEventTrackingRunLoopMode 中,NSDefaultRunLoopMode 被屏蔽了。
好消息是您可以为NSURLConnection 安排其他模式,例如NSRunLoopCommonModes。
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[connection start];
【讨论】:
我发现如果你调用 startImmediately:YES 或省略这个参数第二行是完全没用的。所以一定要遵循@tidwall 提供的确切模式。
这也是一个快速的例子:
self.connection = NSURLConnection(request: self.request, delegate: self, startImmediately:false)
self.connection?.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
self.connection?.start()
【讨论】: