2011-11-25 47 views
3

我對GCD方法很陌生。我正嘗試使用GCD中的塊同步來自Internet的數據。我有一種情況,如果同步操作正在進行,並且網絡出現故障,那麼我的應用程序將崩潰。當不使用塊時,我可以通過使用@ try/@ catch方法來處理它。但是當我試圖用塊和GCD來完成時,我無法處理崩潰或異常。關於如何處理崩潰的任何想法?當GCD中的某個塊無法執行時,我們該如何處理它?

調用塊中的同步帳戶:

dispatch_async(exampleQueue, ^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self sendSyncStatusUpdate:@"Loading Accounts"]; 
    }); 

    [AccountService syncAccounts]; 
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"accountsFirstSyncCompleted"]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tableView reloadData]; 
    }); 
}); 

- [帳戶服務syncAccounts]方法:

@try { 
    ZKDescribeSObject *accountDescription = [app.client describeSObject:@"Account"]; 
    NSString *query = [NSString stringWithFormat:@"Select %@ From Account Where LastModifiedDate > %@", [accountDescription fieldsAsCsv], [dateTimeFormatter stringFromDate:lastSyncDate]]; 

    ZKQueryResult *result = [[app.client query:query batchSize:[NSNumber numberWithInt:200]] retain]; 
} 
@catch (ZKSoapException *e) { 
    [RootViewController hadSyncError:e]; 
} 

我不能趕上,當我們處於脫機狀態,而同步發生的異常。

+0

你有什麼異常? – trojanfoe

+0

沒有代碼,很難分辨出問題出在哪裏,所以我需要猜測。 您可能正在使用「錯誤的」網絡API。我從來沒有見過網絡異常(我已經使用CFNetwork和NSURLConnection,同步和異步),我不知道哪個API會拋出任何異常。也許這個異常是由於你的代碼有錯誤,你得到的東西就像一個*無法識別的選擇器*異常呢? – DarkDust

+0

請張貼代碼! –

回答

2

這是完全可行的。作爲一個評論者建議你可以在塊中使用@ try/@ catch,而不會發生事故。使用您的代碼,例如:

dispatch_async(exampleQueue, ^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self sendSyncStatusUpdate:@"Loading Accounts"]; 
    }); 

    BOOL error = NO;  

    @try { 
     // I pasted this code in line, but you could take the @try/@catch out of the 
     // syncAccounts method, and just let the exception bubble up to here. 
     ZKDescribeSObject *accountDescription = [app.client describeSObject:@"Account"]; 
     NSString *query = [NSString stringWithFormat:@"Select %@ From Account Where LastModifiedDate > %@", [accountDescription fieldsAsCsv], [dateTimeFormatter stringFromDate:lastSyncDate]]; 

     ZKQueryResult *result = [[app.client query:query batchSize:[NSNumber numberWithInt:200]] retain]; 
    } 
    @catch (ZKSoapException *e) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [RootViewController hadSyncError:e]; 
     }); 

     error = YES; 
    } 

    if (error) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self sendSyncStatusUpdate:@"Failed to Sync Accounts!"]; 
     }); 
     return; 
    } 

    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"accountsFirstSyncCompleted"]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tableView reloadData]; 
    }); 
}); 

這是使用GCD的完美方式。

相關問題