2013-05-08 93 views
3

我正在使用一些下載數據的代碼。代碼使用塊作爲回調。有幾種非常類似的下載方法:在回調塊中,如果出現錯誤,它們將顯示UIAlertView。警報視圖始終是這樣的:在方法內或調用該方法時使用dispatch_async()

[req performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { 
    if(error) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 

      [[NSNotificationCenter defaultCenter] postNotificationName:kFailed object:nil]; 
      UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" 
                 message:@"Connection failed" 
                 delegate:nil 
               cancelButtonTitle:@"Ok" 
               otherButtonTitles:nil]; 
      [alertView show]; 
     }); 
    } 
}]; 

我想提醒視圖代碼移動到它自己的方法,因爲它被稱爲多次使用相同的參數。我是否也應該將dispatch_async()移動到該方法,或者我是否應該在dispatch_async()中將該方法的呼叫打包?

回答

0

這與錯誤或正確無關。

優勢:如果你把裏面的方法的dispatch_async(),你可以從你的程序的每一個地方發送消息,無論你是在運行的線程的

缺點:如果將dispatch_async()在該方法內部,即使消息是從主線程發送的,代碼也總是執行異步。 (在這種情況下,dispatch_async()根本就不是必需的,dispatch_sync()將會死鎖。)

反之亦然。

對我來說不同的是更重要的是:定義一個「調度方法」層。僅在此圖層內使用dispatch_async()和dispatch_sync(),而不是在此圖層上構建的圖層中,而不是在此圖層下構建的圖層中。

從更高級別的軟件始終使用此圖層。在圖層內只使用較低層的方法。

0

你可以這樣做。功能的代碼這兩個塊是相同的:

方法1種

//.... Assuming this is called in a block 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [self showMyAlertView]; 
}); 

- (void) showMyAlertView { 
    // Show the alert view and other stuff 
} 

方法2

//.... Assuming this is also called in your block 
[self showMyAlertView]; 

- (void) showMyAlertView { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Show the alert view and other stuff 
    }); 
} 

顯然第二種方式需要行最少的代碼,但如果你想要做其他東西異步(除了顯示你的警報視圖),你可能想要做方法1,所以你可以添加其他的東西到隊列中。

希望這有助於!

相關問題