我开始使用异步,但要获取返回的数据变得很麻烦。然后我开始使用类方法,我相信这排除了使用委托方法的可能性。所以我一直保持同步,知道这将是一个问题,但我认为解决方案不会有这么大的困难。在保持 UI 可交互的同时检索数据的最佳方法是什么?
3 回答
同步 NSURLConnections 在 NSOperation 内部工作得很好——因为你正在同步使用它们,一个 NSOperationQueue 交给 NSOperations 将自动使用后台线程来运行它们(否则你必须做额外的工作)。
让 URL 连接在后台线程中运行是保持 UI 响应的关键,这是异步 NSURLOperation 默认情况下不做的事情(看看数据回调都在哪个线程上)。
有时你想处理传入的数据(比如如果你有一个进度条),在这种情况下异步 URL 连接更好,它们仍然可以在 NSOperation 中。
因为这让你感到沮丧,你可能很想看看替代的 ASIHTTPRequest 库,它也基于 NSOperation 但似乎它可能会让你不那么痛苦(他们有很好的示例代码):
NSURLConnection 同步调用应该能够卡在后台线程中,但我强烈建议您处理“麻烦”,并使用正确的方式™。在保持 UI 交互的同时检索数据的最佳方法是使用 NSURLConnection 的异步方法。
出于兴趣,您在获取数据时遇到了什么问题?我发现在完成后使用异步 NSURLConnection 和 NSNotificaion 是一个非常方便的解决方案。
在你需要数据的类中(我通常把它放在init方法中)
-(id)init{
... object setup ...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ScanCompleted" object:nil];
}
updateView 是连接完成接收数据时调用的方法
在 NSURLConnection
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
//Notify that we are finished
[[NSNotificationCenter defaultCenter] postNotificationName:soapAction object:self];
}
这对我来说非常有效 - NSURLConnection 是线程化的,因此 UI 不会锁定,并且会在数据下载完成后更新。