UIScrollView 滚动时 NSURLRequest 不会触发

发布于 2024-09-30 15:51:43 字数 156 浏览 6 评论 0原文

我有一个问题,当用户在 UIScrollView 上移动时,我试图在后台加载声音文件...问题是我正在使用 NSURLRequest,这样我就可以在后台加载,但即使如此,它也拒绝实际加载,直到UIScrollView 已停止滚动。 :(

对此我能做些什么吗?

谢谢!

I have a problem in that I am trying to background load a sound file while the user moves around a UIScrollView... The problem is that I am using NSURLRequest so I can load in the background, but even then it refuses to actually load until the UIScrollView has stopped scrolling. :(

Is there anything I can do about this?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

日裸衫吸 2024-10-07 15:51:43

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];

The NSURLRequest only manages the request, not the actual connection.

Touch events such as scrolling will place the run loop into NSEventTrackingRunLoopMode. By default, an NSURLConnection is scheduled to only execute in NSDefaultRunLoopMode. So while in NSEventTrackingRunLoopMode, NSDefaultRunLoopMode is blocked.

Good news is that you can schedule additional modes for an NSURLConnection, such as NSRunLoopCommonModes.

connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[connection start];
呆橘 2024-10-07 15:51:43

我已经找到了一个困难的方法,如果你调用 startImmediately:YES 或省略这个参数,第二行是完全没有用的。因此,请务必遵循@tidwall 提供的确切模式。

这也是一个简单的例子:

self.connection = NSURLConnection(request: self.request, delegate: self, startImmediately:false)
self.connection?.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
self.connection?.start()

I've figured out the hard way that if you call startImmediately:YES or ommit this parameter second line is completely useless. So be sure to follow the exact pattern provided by @tidwall.

Here's also a swift example:

self.connection = NSURLConnection(request: self.request, delegate: self, startImmediately:false)
self.connection?.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
self.connection?.start()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文