2011-03-25 55 views
2

我需要對http服務器異步運行查詢並處理響應。查詢真的是一個相當大的方法調用鏈,回調。這增加了複雜性,因爲在調用鏈中有很多返回路徑。如何可靠地管理後臺請求?

直到當前的請求完全完成,才能啓動新的請求。

這裏的大致輪廓:

  1. 一些線程調用[Foo poll]
  2. poll方法啓動一些在後臺運行的HTTP請求。在這種情況下,ASIHTTPRequest。
  3. 這些請求最終會調用[Foo onRequestComplete]來解析響應。在錯誤[Foo onRequestError]被調用。這是第二個返回路徑。
  4. 然後通過回調和更多返回路徑對服務器進行更多調用。
  5. 最終將一些東西保存到磁盤。
  6. 的調查是完全

這裏是收集:在這些步驟中,調用poll應該被忽略(返回)或阻塞,直到調查完成。

在另一輪詢正在運行時,如何確保poll功能塊或無操作?

+2

一個非常幼稚的做法是增加一個'Server.isBusy'屬性,但不是線程安全的,非常雜亂維護,考慮錯誤處理路徑等。關於GCD,塊或同步? – 2011-03-25 20:36:40

+0

鎖定或GCD - http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW1 – Joe 2011-03-25 20:46:35

回答

2

只需使用NSLock

[Foo poll]

if ([lock tryLock]) { 
    // Do your stuff 
} 

[Foo onRequestComplete]

[lock unlock]; 
+0

這是一個有點凌亂來維護。你需要在整個地方添加「lock」和「unlock」調用(基本上在每個可能的返回路徑中,回調等)。我有一種惱人的感覺,應該是更簡化的方法,可能使用GCD,但我看不到它。令人沮喪。 – 2011-03-26 14:14:13

+0

@Martin Wickman:你提出問題的方式,聽起來就像你有一個入口和一個回調。您可能會在迴應請求失敗時回覆,但這仍然只是您需要考慮鎖定的三個地方。如果你有足夠的返回路徑來使這個鎖解決方案難以維護,也許是返回路徑的數量是問題而不是鎖? – 2011-03-26 17:41:04

+0

這更多的是由一系列(http,parse,http,http,...,保存到磁盤,完成)組成的事務。有一個鎖定入口點,但每一步都有自己的回調,這使得在某個地方很容易錯過「解鎖」。但除非沒有別的辦法,否則我猜這就是答案。 – 2011-03-28 08:54:54