1

我想使用NSOperationQueue來實現一些後臺網絡請求。我有幾個不同的請求會被代碼的不同部分添加到隊列中,其中一個會比另一個更頻繁地運行。將NSOperation依賴項添加到已經在NSOperationQueue中的操作

我已經實現了這個使用GCD所以我有代碼塊,因此我打算簡單地使用NSBlockOperation方法blockOperationWithBlock:^{...}而不是創建子類NSOperation

這個問題是我想創建請求之間的依賴關係。如果這個隊列已經有一個NSBlockOperation for requestA,那麼當我爲requestB創建NSBlockOperation時,我想爲它添加一個依賴關係。在同時創建操作時這很簡單,但我找不到一個簡單的方法來確定隊列中已存在的操作。

NSOperationQueue有一個operations屬性,所以我可以檢索自己的操作列表,但我如何確定哪個操作是哪個?我沒有看到可以使用的名稱/說明屬性。

我能想到的選項是:

  1. 子類NSOperation創建自定義對象爲每個請求類型,然後使用從operations屬性檢索的對象自省
  2. 子類NSBlockOperation並添加說明財產

我是否錯過了其他一些明顯的方法來做到這一點?

+0

難道你不能只是讓你的'NSBlockOperation'對象躺在一起,你可以知道哪個是哪個? – mattjgalloway

回答

2

添加一個實例變量來保存最近的requestA操作。在requestA塊的末尾將其清除。例如。

_requestA = [NSBlockOperation blockOperationWithBlock:^{ 
    // Normal requestA code here. 
    // ... 

    // Assuming you create all requestA and requestB instances on the main thread... 
    dispatch_async(dispatch_get_main_queue(), ^{ _requestA = nil; }); 
}]; 

然後,當你創建一個requestB,你可以把它作爲一個依賴最新requestA,如果還有要使用的一個。

+0

感謝羅布,這是一個很好的建議,我認爲它會做我所需要的。我會放棄它。 –

0

我想說正確的方法是子類NSOperation或NSBlockOperation,並在這個子類中實現一個-(BOOL)isEqual:(id)object方法,以便您可以比較您在NSOperationQueue的操作屬性中找到的操作。這樣,你應該可以使用內置的[operationA addDependency:operationB];

相關問題