如果您只是想知道它何时完成并且不关心任何数据,只需使用NSNotificationCenter
发布通知并让您的视图订阅它。
代表 - 完成后发布通知
-(void) connectionDidFinishLoading:(NSURLConnection*)connection {
[[NSNotificationCenter defaultCenter] postNotificationName:@"NSURLConnectionDidFinish" object:nil];
}
查看 - 添加观察者和观察
-(void) viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(yourCleanupMethod)
name:@"NSURLConnectionDidFinish"
object:nil];
}
-(void) yourCleanupMethod {
// finish up
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
现在,当运行一些代码,如果你需要通过一个简单的对象追溯到数据,你可以尝试加载你的通知中的对象参数,如下所示:
[[NSNotificationCenter defaultCenter] postNotificationName:@"NSURLConnectionDidFinish" object:yourDataObject];
然后改变你的观点和清理签名是这样的:
-(void) viewDidLoad {
// Notice the addition to yourCleanupMethod
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(yourCleanupMethod:)
name:@"NSURLConnectionDidFinish"
object:nil];
}
-(void) yourCleanupMethod:(NSNotification *)notif {
// finish up
id yourDataObject = [notif object];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
现在我发现自己需要的东西比这多一点,所以我结束了创建一个单身处理我所有的请求。由于NSURLConnectionDelegate
中的所有代理方法都为您提供了特定连接的NSURLConnection
实例,因此您可以将简单的数据对象存储在字典中,并且每次都可以通过连接查找它。从那里我有一个方法签名,采取和对象和选择器中,我与连接关联,所以在所有事情已经结束后,我可以通过在该对象上执行选择器将该可变数据对象传递给请求者。
我不会在这里包含所有的代码,但也许这会帮助你思考什么是可能的。我发现我在编写Web服务调用时遇到了很多代码,因此将所有东西封装在一个单例中给了我一个很好的获取数据的简洁方法。希望这可以帮助!
任何理由,你为什么不能简单地做,从委托,而不是正确的,在循环“下一步”的东西? :) –
是否避免以并列方式启动许多请求?如果是这样,你的委托方法可以负责从服务器获取下一个结果。有很少的情况下,你真的想阻止HTTP请求,特别是如果你正在做很多事情。 –
我遇到了与OP相同的情况,我有一个应用程序在后台线程中大量使用同步调用,现在想要支持使用异步使用的自定义身份验证(使用NSURLConnection的委托方法)。相反,重写应用程序,我可以“包装”异步调用,基本上使它们同步,因为它们已经发生在后台线程上,一切都很好。 – Aaron