我正在創建一組與Web服務接口的類。其核心是使用異步NSUrlConnection從服務中檢索數據。在我看來,重要的是它是異步的,因爲這些Web服務接口的客戶端必須能夠取消正在進行的請求(即取消NSUrlConnection)。異步NSUrlConnection不在主循環
Web服務調用會返回JSON數據,可能會有很多數據,這會被解析,我創建的類將創建適當的數據結構。根據所調用的Web服務方法的不同,請求最終會變得非常昂貴 - 在主線程上運行的代價太高,所以我想要添加異步運行服務請求的選項,或者不給出選項,並強制異步調用。
異步調用都很好,但我在啓動NSUrlConnection時並不是主要的runloop上的問題。我所描述的問題似乎有相當詳細的記錄:我被引導認爲NSUrlConnection的委託沒有被調用,因爲啓動連接的runloop已經終止,因此返回委託的調用不能被調度到它的runloop 。
解決此問題的最佳方法是什麼?
我已經嘗試使用:
while (!self.isRequestComplete && !self.isRequestCancelled)
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
這似乎從基本試用我已經做了工作正常,但如果這是被上執行的runloop實際上是主要runloop,對此我有一些崩潰...
將選項是否提供異步調用客戶端,然後使用上述方法,如果使用該選項?有沒有更好的方法來實現我想要做的事情?
我打算實現的是一個類包,它允許與我的特定Web服務進行交互,其中我的代碼的客戶端不需要擔心他們自己的代理(我的類持有引用)是否會被調用不同的線程。我希望他們被稱爲完全相同的runloop,他們稱我的代碼 - 基本上,NSUrlConnection如何運作!
在此先感謝! 尼克
如果我這樣做使用併發NSOperation或使用GCD,我遇到了同樣的問題。我擔心運行循環的原因是因爲任何對NSUrlConnection進行異步調用的異步調用都會在不久之後終止,因此NSUrlConnection無法在原始運行循環上調用我的委託。 – 2012-02-03 01:30:58