我正在嘗試設置和使用大中央調度一個NSURL,但它看來,變量設置和訪問,直到您嘗試訪問它的宏偉中心調度塊之外設置變量。與大中央調度無法找回
-(void)viewDidLoad {
[super viewDidLoad];
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(backgroundQueue,^{
self.ubiquitousURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
NSLog(@"ubiq inside: %@", self.ubiquitousURL);
if (self.ubiquitousURL) {
self.iCloudDocURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@Documents", self.ubiquitousURL]];
self.iCloudDocString = [self.iCloudDocURL absoluteString];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadFiles) name: UIApplicationDidBecomeActiveNotification object:nil];
} else {
/* change to the main queue if you want to do something with the UI. For example: */
dispatch_async(dispatch_get_main_queue(),^{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Please enable iCloud" message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
});
}
});
NSLog(@"ubiq outside: %@", self.ubiquitousURL);
}
第一NSLog
其中,開始與ubiq inside
返回正確的URL,而ubiq outside
返回null。我使用ARC,所以不需要提及內存或類似的東西......這是一個GCD問題。
你知道爲什麼self.ubiquitousURL
是無法訪問的GCD塊外?謝謝。
這看起來不錯,謝謝!由於'dispatch_async'有一個延遲,我應該使用'dispatch_sync'嗎?這有什麼問題嗎? – 2012-07-08 00:44:39
'dispatch_sync'會暫停應用的主隊列,直到塊完成,在這種情況下意味着直到iCloud響應您的請求。連接不好的用戶(比如紐約的AT&T用戶)可能會延遲幾分鐘。用戶會認爲該應用「已凍結」,並且如果此代碼在您的應用啓動時運行,則iOS可能會將其關閉,因爲它啓動得太慢。換句話說,我強烈建議不要在這裏使用'dispatch_sync'。在內部'dispatch_async'調用中做任何你想做的事情。 – 2012-07-08 00:49:55
「dispatch_async」表示「稍後運行」。因此,塊內部的代碼不會立即運行......「此外,即使block *被立即調度,它可能無法達到它分配給ubiquitousURL屬性的位置,然後該方法中的代碼嘗試檢索它。這是一個直接的競爭條件。 – 2012-07-18 06:08:26