2013-09-25 84 views
0

我喜歡創造一個NSOperationQueue,該NSOperatioQueue應該刷新UILable,我創造了這個代碼:NSOperationQueue錯誤:線程1:EXC_BAD_ACCESS(代碼= 2,地址=爲0x4)

NSOperationQueue * ramQueue = [NSOperationQueue alloc]; 
    [ramQueue addOperationWithBlock:^{ 
     while (TRUE) { 

      //Creating String 

      NSOperationQueue *main = [NSOperationQueue mainQueue]; 
      [main addOperationWithBlock:^{ 

       //Refresh Label 

      }]; 

     } 

    }]; 

但它不會工作,標籤不顯示新的字符串。是在這裏顯示一個錯誤:[ramQueue addOperationWithBlock:^{

任何人都知道如何解決這個問題?

+0

請提供您想要實現的更多細節。刷新UILabel是什麼意思?你爲什麼要嵌套2'addOperationWithBlock:'調用? –

+0

大概是將工作踢回UI更新的主隊列。我更擔心'while(TRUE)'循環 - 看起來像一個操作會運行相當長的一段時間,可能會使主操作時間隊列捱餓,或者使用新的塊操作(或兩者!)重載它。 – Tim

+1

'ramQueue'的'init'可能不是必須的,但是當我看到一個時,我總是感覺好些。 :) –

回答

0

一對夫婦的想法:

  1. [NSOperationQueue alloc]應該是[[NSOperationQueue alloc] init]

  2. 我一般建議不要結束while循環。如果你想重複做一些事情,重複計時器(以一定的合理速率,可能不超過每秒10-20次)可能是更好的構造。如果使用while循環結構,則可以比主循環更快地將結果發送到主隊列。 (這取決於該while循環內什麼。)

  3. 如果你留在這while環路(再次,我會鼓勵你做),你可能想要一個@autoreleasepool裏面有那麼任何自動釋放對象得到釋放。

    [ramQueue addOperationWithBlock:^{ 
        while (TRUE) { 
         @autoreleasepool { 
          //Creating String 
    
          NSOperationQueue *main = [NSOperationQueue mainQueue]; 
          [main addOperationWithBlock:^{ 
    
           //Refresh Label 
          }]; 
         } 
        } 
    }]; 
    

    你甚至可能希望使用信號燈,以確保後臺操作不會太快發佈事件。

  4. 可能與您的問題無關,但如果您正在更新任何共享資源(例如,更改任何類屬性或ivars),請確保將它們與主隊列同步。您可以通過將這些更新分發回主隊列或採用某種鎖定機制來實現這一點。

1

好的,我想感謝羅布,指着我走向正確的方向!

這裏是我的權利代碼:

所有我創建[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(updateRam) userInfo:nil repeats:YES];代替while(TRUE){}循環的第一。然後我糾正了我NSOperationQueue這樣的代碼:

-(void)updateRam { 

    NSOperationQueue * ramQueue = [[NSOperationQueue alloc] init]; 
    [ramQueue addOperationWithBlock:^{ 

     //Create String 

     NSOperationQueue *main = [NSOperationQueue mainQueue]; 
     [main addOperationWithBlock:^{ 

     //Refresh Label 

     }]; 

    }]; 
} 

感謝阿甘!

相關問題