2014-03-02 82 views
-1

我正在運行一個循環來分解一天,並計算出我的活動步行時間。CMStepCounter阻止IOS7中的UI活動for循環與異步gcd

該代碼工作正常,並提供所需的結果。但是,在執行queryStepCountStartingFrom時,它會阻止UI在for循環調用期間。

我試圖刪除從代碼中調用queryStepCountStartingFrom與10秒睡眠更換,並已證明有與UI沒有問題,以這種方式運行時。我也嘗試刪除queryStepCountStartingFrom之後的循環中的活動,並且存在問題。所以我現在確信問題在於代碼的這一部分。

我使用GCD運行的代碼,並期望for循環不應該是在主線程的UI干擾。 (當我說用戶界面時,我有其他屏幕,模式和標籤,如果我按這些屏幕,屏幕不會改變,直到for循環完成,但如果queryStepCountStartingFrom行不在那裏,而是我添加一個睡眠,問題不在那裏)。延遲還會阻止我的代碼的其他區域在同一屏幕上運行簡單的步數枚舉以獲取當天的當前步數。

有人能告訴我爲什麼會出現這個問題,以及我如何糾正它?

非常感謝。

- (void) getActiveTime { 
    if([CMStepCounter isStepCountingAvailable]) 
    { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
      @autoreleasepool { 
     CMStepCounter *stepCounter = [[CMStepCounter alloc] init]; 
     NSOperationQueue *checktimequeue = [NSOperationQueue new]; 
     checktimequeue.name = @"Check Time Queue"; 
     NSLog(@"START"); 
     __block NSInteger activeTime = 0; 
     __block NSDate *activetimerangeNow = [NSDate date]; 

     for (NSDate *activetimerangeStart = [self startDateOfToday]; 
      [activetimerangeStart compare:activetimerangeNow] == NSOrderedAscending; 
      activetimerangeStart = [activetimerangeStart dateByAddingTimeInterval:10]) 
     { 
      NSDate *checkRangeStart = activetimerangeStart; 
      NSDate *checkRangeEnd = [activetimerangeStart dateByAddingTimeInterval:10]; 
      [stepCounter queryStepCountStartingFrom:checkRangeStart 
               to:checkRangeEnd 
              toQueue:checktimequeue 
             withHandler:^(NSInteger numberOfSteps, NSError *error) { 
              if (numberOfSteps > 1) { 
               activeTime=activeTime+10; 
              } 
              NSComparisonResult result; 
              result = [checkRangeEnd compare:activetimerangeNow]; 
              if(result==NSOrderedAscending){ 
               // still in loop 
              } 
              else if(result==NSOrderedDescending){ 
               // end of loop - date greater 
               NSLog(@"rangeEnd = %@; dateCompare = %@",checkRangeEnd, activetimerangeNow); 
               dispatch_async(dispatch_get_main_queue(), ^{ 
               [self callbackActiveTime:activeTime]; 
               }); 
              } 
              else { 
               // end of loop - dates are same 
               NSLog(@"rangeEnd = %@; dateCompare = %@",checkRangeEnd, activetimerangeNow); 
               dispatch_async(dispatch_get_main_queue(), ^{ 
               [self callbackActiveTime:activeTime]; 
               }); 
              } 
             }]; 
      } 
      }; 
      }); 
    } 
} 

- (void)callbackActiveTime:(NSInteger)activeTime { 
    NSLog(@"Active Time = %d", activeTime); 
    self.activeLabel.text = [NSString stringWithFormat:@"%.f mins", (double)activeTime/60]; 
} 

編輯 我剛剛搬進

NSOperationQueue *checktimequeue = [NSOperationQueue new]; 
      checktimequeue.name = @"Check Time Queue"; 

而且還交換了GCD背景。

兩個環之上,因爲我意識到這將創造許多情況下,然而,同樣的問題仍然存在。?

任何想法的歡迎。

回答

0

好吧,我已經用旗語等待響應來自異步過程中的處理程序解決了這一點。

儘快創建信號量,我開始循環內每個迭代: -

sema = dispatch_semaphore_create(0); 

在循環(處理後)的最後等待: -

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 

的處理函數中中,已接收到響應之後,信號完成: -

dispatch_semaphore_signal(sema);