記住操作都能夠在單獨的線程運行,通常之間完成。一個NSOperationQueue
實際上有它自己用於獲取稱爲operationCount
的計數方法,並提供謹慎這個詞:作爲 操作完成
通過這種方法 返回的值反映了隊列 對象和變化的瞬時數。因此,當您使用返回的 值時, 的實際操作數 可能會有所不同。因此,您應該使用 僅用於近似 指導,並且不應該依賴於該值來計算 對象枚舉或其他精確 計算。
您遇到的問題可能是併發問題。有一點需要考慮的是複製操作數組。
NSArray *ops = [queue.operations copy];
if ([ops count] > 0)
{
op = [ops objectAtIndex:0];
//You can check if it has finished using [op isFinished];
//and do what you need to do here
}
[ops release];
更新:
這就是爲什麼你會看到這種情況出現往往一個例子
//Set up and start an NSOperation
...
//Here your call to operations probably put some sort of lock
//around operations to retrieve them but your operation also
//finished and is waiting for your lock to complete to remove
//the operation. The operations call probably returns a copy.
if([[que operations] count] > 0)
{
//Now the operation queue can access its operations and remove
//the item with the lock released (it can actually access as early
//as before the call and count)
//Uh oh now there are 0 operations
op = [queue.operations objectAtIndex:0];
}
來源
2011-06-30 16:34:27
Joe
你的意思是檢查的次數和分配變量之間存在如此高的手術完成的機會? 這種情況很奇怪,因爲op =賦值是毫無意義的,根本無法使用。 – Teddy
是不是併發性很好?這就是複製操作的原因,如果你真的想用第一個操作做一些操作,像我的例子那樣複製操作,然後你可以安全地使用'op'。如果你關心它是否完成,只需調用'isFinished'方法即可。 – Joe
不錯。我一直在我的代碼中使用一些蘋果示例,但似乎應該注意這個「複製」的東西。與此同時,我沒有使用op =語句解決了這個問題,因爲沒有真正的需要。再次感謝喬。 – Teddy