作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序应该更新其有关网络服务的信息。这项工作应该在一个单独的线程中完成。我不想从我的 ViewController 进行简单的异步调用,因为它们还有很多其他工作需要线程来完成。
如果收到并执行了所有响应,则另一个线程应该在我的 ViewController 上调用一个委托(delegate)。
你能给我一些实现它的技巧和基本知识吗?
最佳答案
您可以使用 NSURLConnection 来完成此操作,但代码非常复杂。
我编写了一个简单的类,用于在后台线程上发出异步 Web 请求。您可以在这里找到它:https://github.com/nicklockwood/RequestQueue
它的工作方式与 jsd 建议的 NSOperationQueue 类似(如果需要,您实际上可以将它与 NSOperationQueue 一起使用),但我认为您会发现它更易于使用。
以下是您如何使用我的类从 View Controller 发出请求:
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://someurl?foo=bar"]];
[[RequestQueue mainQueue] addRequest:request completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
//do something with the response
}];
因为它使用 block ,所以您不需要创建委托(delegate)方法,您可以直接将处理代码放在回调中(我在其中放置了“do something with response”注释)。
该回调中的代码将在主线程上调用,因此在其中更新您的 UI 是安全的,但是它会在您实际启动请求几秒钟后调用,在它在后台完成下载之后 - 就像委托(delegate)方法。
关于iphone - 如何在应该执行回调的后台线程中交换任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9236828/
我是一名优秀的程序员,十分优秀!