2013-04-02 32 views
-2
-(void)GrabbingProcess:(void (^)())block; 
{ 
    AssertNonMainThread; 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
     if (self.OtherGrabbingIndicator == 0) 
     { 
      self.isStillLoading = true; 
     } 
     self.OtherGrabbingIndicator ++; 
     AssertMainThread 
    }]; 

    block(); 


    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
     [self updateStatusAtList]; 
     self.OtherGrabbingIndicator --; 
     if (self.OtherGrabbingIndicator ==0) 
     { 
      self.isStillLoading = false; 
     } 
     AssertMainThread 
    }]; 
} 

基本上,代碼設置,以便self.OtherGrabbingIndicator ++總是以self.OtherGrabbingIndicator--如何解決這種錯誤的

來平衡

我想不出任何理由爲什麼會失敗。它不會失敗。

現在,偶爾會失敗。 self.OtherGrabbingIndicator會懸停在2或1,並且所有線程都停止。不知何故有些++不能被 - 平衡。但是,這怎麼可能呢?

我不知道如何。

我檢查周圍有沒有辦法self.OtherGrabbingIndicator改變其他任何地方。

一件事我打算做是增加一個塊的值在一些陣列和適當地去除那些塊。問題是,如果我知道塊,我怎麼知道塊代表什麼代碼?

它用於正常工作,現在它不。這迫使我堅持下去。

我能想到的唯一的辦法是,不知何故塊()未能完成但塊未完成,怎麼能出現這種情況?

如果我按暫停,所有的線程都是空的。

更新:將@synchronized()添加到++並解決問題。但是,它沒有任何意義。

應該還是工作,沒有@synchronized因爲mainQueue只有1最大線程並同時執行的事情之一。

+1

沒有評論只是downvotes。這到底是什麼?是的,這是困難的問題。我嘗試了很多東西。我根本想不出爲什麼代碼會失敗的原因。這是一個非常簡單的代碼。 –

回答

1

不幸的是,我對你沒有最終答案。但是,我最近在NSOperations上遇到過類似的情況,我將與您分享。

有關代碼的幾個問題:

是否在addOperationWithBlock第一塊需要「塊()」調用之前完成CA被執行?

第二個塊是否需要在執行前完成其他操作?

在我的情況下,按照正確的順序添加的操作,但是基於操作隊列的線程調度(該操作隊列的線程調度低於需要操作結果的其他線程),它們被執行得太晚並且代碼失敗。

我不知道該怎麼時間關鍵是你抓的過程,但對我來說我的應用程序的時間關鍵部分使用的NSOperation的是從來沒有工作時間的100%。因此,我重新設計使用NSThread,我們可以控制優先級,從那以後一切正常。

我這方面的經驗後,結論是的NSOperation是一個偉大的工具,因爲它是簡單易用,但是沒有多大幫助的時間危急的情況,因爲它是不是真的意味着該用例。

希望這對你有所幫助,祝你好運。

+0

不,它不。發生什麼是我並不關心++是在執行之前,之後還是與 - 和block()同時執行。重要的是每個++都有 - 。同樣因爲mainQueue只有1個併發,那麼是的,++會先執行。這根本不重要。 –

+0

儘管添加工作。但是,這仍然沒有意義。所有mainQueue線程都應該同步,即使沒有。 –