2014-03-24 65 views
0


我是編程iOS中的新手,現在我遇到了如果我在真實設備上運行應用程序時無法獲得iCloud連接的問題。
該應用程序在模擬器上運行完美,如果我從我的Mac斷開設備。
有沒有人知道我可以修復它?
這是我寫的連接到iCloud的
iCloud在模擬器上連接,但不在設備上

self.fileManager = [NSFileManager defaultManager]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     self.ubiquityIdentifier = [self.fileManager URLForUbiquityContainerIdentifier:nil]; 
    }); 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     if(self.ubiquityIdentifier) 
     { 
      [[NSNotificationCenter defaultCenter] postNotificationName:kiCloudAvailableNotification object:self.ubiquityIdentifier]; 
      [self startMediaQuery]; 
     } 
     else 
     { 
      [[NSNotificationCenter defaultCenter] postNotificationName:kiCloudNotAvailableNotification object:self.ubiquityIdentifier]; 
      NSLog(@"iCloud not available"); 
     } 
    }); 

如果設備連接我只在else塊去的代碼,如果我在模擬器上或不連接的設備一切正常測試精細。
非常感謝。
weissja19

+0

你可以請你分享你如何連接到iCloud,也許它往往會失敗? – JuJoDi

回答

1

假設你正在檢測故障,因爲NSLog打印其「icloud的不可用」的消息,你在這裏設置了一個經典的比賽條件:

  1. 設置的在全局(非主)隊列上的值爲self.ubiquityIdentifier
  2. 測試在主隊列上的值self.ubiquityIdentifier

這兩個dispatch_async調用運行在不同的隊列上。因此,在測試之前,不能保證您設置的值爲self.ubiquityIdentifier。它有時會起作用,在別人身上失敗,並不一定是出於任何明顯的原因。當您收到「iCloud not available」消息時,這是因爲第二個隊列在分配任何值之前檢查了該值。

修復方法是更改​​調度調用,以便可以保證執行的順序。兩種可能性:

  1. 結合這兩種dispatch_async呼叫,使得所有的代碼都發生在同一個隊列,或
  2. 移動第二dispatch_async第一,這樣你就不會派遣回主隊列,直到您爲self.ubiquityIdentifier設置了一個值。
+0

謝謝。現在它完美:) – weissja19

相關問題