2015-09-03 68 views
0

我有這段代碼並嘗試將變量NotAllSaved設置爲true,但在調用saveObject返回後,該變量再次爲false 。如何在調用方法中設置變量 - 例如[... {here}]

NotAllSaved=false 
[healthStore saveObject:theSample withCompletion:^(BOOL success, NSError *error){ 
    if (!success){ 
     if (error.code==HKErrorAuthorizationDenied) { 
      NotAllSaved=true; 
     } else { 
      ...  
     } 
    } 
}]; 
if (NotAllSaved) { 
    // Does never come here 
} 

如何設置變量,以便我可以處理調用SaveObject之外的錯誤?如果我嘗試在那裏彈出提醒,則應用程序在顯示彈出窗口之前需要很長時間。

-

補充:

謝謝裂解和薩希卜羅伊,你的答案(和一些額外的谷歌搜索)解決我的問題,這樣對我的作品的解決辦法是這樣的:

__block bool NotAllSaved=false; 
dispatch_group_t theWaitGroup = dispatch_group_create(); 
dispatch_group_enter(theWaitGroup); 
[HDBI.healthStore saveObject:theSample withCompletion:^(BOOL success, NSError *error){ 
    if (!success){ 
     if (error.code==HKErrorAuthorizationDenied){ 
      NotAllSaved=true; 
     } else { 
      .. . 
     } 
    } 
    dispatch_group_leave(theWaitGroup); 
}]; 
dispatch_group_wait(theWaitGroup, DISPATCH_TIME_FOREVER); 
if (NotAllSaved) { 
+0

您已經驗證花費很長時間來顯示錯誤的應用程序不僅僅是需要很長時間來執行完成塊的應用程序?如果它異步發生,完成塊中的代碼不會在同步函數的最後一行(if(NotAllSaved)語句)之後被調用。嘗試在if(!success)和if(NotAllSaved)上設置斷點並查看它們的執行順序。 – Lytic

+0

我在那裏顯示了一個錯誤對話框(UIAlertView),並且無法解除它,所以出於某種原因,這不是一件好事。 –

+0

嘗試將調用封裝在performOnMainThread或dispatch_async(dispatch_get_main_queue) – Lytic

回答

1

這是異步使用塊的行爲。

withCompletion:{}中包含的代碼實際上不會執行,直到操作隊列運行該塊爲止。它通常會發生在檢查後,如果(NotAllSaved)

錯誤必須完成區塊內進行處理(或者可以稱之爲一個錯誤處理程序)

例如:

NotAllSaved=false 
[healthStore saveObject:theSample withCompletion:^(BOOL success, NSError *error) 
      { 
       if (!success) 
       { 
        if (error.code==HKErrorAuthorizationDenied) 
        { 
         NotAllSaved=true; 
        } 
        else 
        { 
         ...  
        } 
       } 

       if (NotAllSaved) 
       { 
        // Will execute now 
       } 
      }]; 
0

這是因爲這不是一種方法,它是一個以插入符號^開頭的塊,當您想要訪問塊內的任何局部變量時,該塊會創建變量的副本,或者在塊內部像這樣考慮它變量e是read only,爲了使可變讀寫使用這個

__block BOOL NotAllSaved = false; 現在通過使用__block(2個下劃線)來設置該變量,您通過其引用調用該變量

相關問題