2012-10-19 62 views
1

我有一個導入序列,從檔案中讀取,解壓縮包含文件併爲每個文件創建相應的核心數據實體。這整個過程發生在後臺,併爲每個線程創建了一個單獨的上下文等,因此一切正常。從UIAlertViewDelegate回調到後臺線程回調

事實證明,這個特定的導入序列的一個令人滿意的功能是,我們允許任何輸入文件被密碼保護(其中有幾個包含在檔案中),所以我需要檢查一個文件是否是密碼在這種情況下,用戶將被提示通過UIAlertView輸入密碼。

這是我的問題開始的地方。

我發送UIAlertView提示到我應該的主線程,將我的導入器object指定爲delegate並等待用戶輸入。

當用戶輸入密碼並點擊確定/取消時,委託回調仍在主線程中,因此我無法操作相應的核心數據實體,而無需大量工作(即存儲對受管理對象ID的引用創建新的上下文等)。

我的問題:

是否有可能在導入過程正努力回到我原來的後臺線程?我會怎麼做呢?

感謝, 羅格

+0

難道你的進口商保持其螺紋參考使用'[NSThread currentThread ]'然後,在委託回調中,使用'performSelector:onThread:withObject:waitUntilDone:'將密碼傳遞迴進口商的線程? –

+1

在開始處理密碼之前,我會檢查所有的密碼文件,並提前要求提供密碼。這樣,如果我進行了長時間的導入,我可以啓動它並走開,一小時後不再回來,期待它完成,並且發現它在第三個文件中等待我輸入密碼。 – lnafziger

回答

3

我會嘗試使用dispatch semaphore。將它保存在一個實例變量中。

@interface MyClass() 
{ 
    dispatch_semaphore_t dsema; 
} 
@end 

然後,在後臺線程方法:

// this is the background thread where you are processing the archive files 
- (void)processArchives 
{ 
    ... 
    self.dsema = dispatch_semaphore_create(0); 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle: @"Title" 
                   ... 
                  delegate: self 
                   ... 
     ]; 
     [alertView show]; 
    }); 

    dispatch_semaphore_wait(self.dsema, DISPATCH_TIME_FOREVER); 
    // --> when you get here, the user has responded to the UIAlertView <-- 

    dispatch_release(self.dsema); 
    ... 
} 

UIAlertView將調用此委託方法:

// this is running on the main queue, as a method on the alert view delegate 
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    // do stuff with alertView 
    if (buttonIndex == [alertView firstOtherButtonIndex]) { 
     ... 
     // when you get the reply that should unblock the background thread, unblock the other thread: 
     dispatch_semaphore_signal(self.dsema); 
     ... 
    } 
} 
+0

謝謝,這非常好,我也學到了一些新東西:) – Rog