2012-02-02 24 views
1

我正在創建一組與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如何運作!

在此先感謝! 尼克

回答

0

我想你可能已經「上錯了河」可以這麼說。一般來說,除非你做的事情很奇怪,否則你不需要擔心運行循環。這聽起來像你需要閱讀多線程,尤其是Grand Central Dispatch。

+0

如果我這樣做使用併發NSOperation或使用GCD,我遇到了同樣的問題。我擔心運行循環的原因是因爲任何對NSUrlConnection進行異步調用的異步調用都會在不久之後終止,因此NSUrlConnection無法在原始運行循環上調用我的委託。 – 2012-02-03 01:30:58