如果您只是想知道它何時完成並且不關心任何數據,只需使用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