2011-04-01 73 views
1

當我的應用程序啓動時,我想初始化一個UIImagePickerController。由於這可能需要幾秒鐘,我想在後臺執行。在調用選取器之前,確保後臺任務完成的最佳方法是什麼?在後臺加載UIImagePickerController

目前我有以下代碼。它可以工作,但如果在後臺任務完成之前調用選取器,它會崩潰。

- (void) viewDidAppear: (BOOL)animated { 

    [super viewDidAppear: animated]; 

    [self performSelectorInBackground:@selector(initPicker) withObject:nil]; 


    .... 

} 

- (void) initPicker { 
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

     NSLog(@"picker start... "); 
     [self setPicker: [[UIImagePickerController alloc] init]]; 

     NSLog(@"picker done."); 

     [pool release]; 

    } 

謝謝!

編輯:這變成我們這個問題有點理論。在設備上,計算[[UIImagePickerController alloc] init]僅需要調試模式的時間。所以對於生產代碼,不需要在後臺運行任何東西。另外,[[UIImagePickerController alloc] init]似乎鎖定主線程,所以即使在調試模式下,將其放置在後臺線程上也沒有優勢。

回答

1

我會用NSConditionLock來表示您的控制器已加載。在-initPicker方法中,我將在UIImagePickerController完成初始化時設置條件。在IBAction展示選取器時,我會檢查這種情況。有關更多選項,請參見Threading Programming Guide

0

您是否可以等到您的「選取器完成」,然後將選取器視圖添加到任何視圖使其可見? 這樣的事情,你的「選擇器做」 statment之後:

[self presentModalViewController: theImagePickerController]; // assuming self is a viewController. 
+0

謝謝您的回覆。我認爲這不會起作用。首先,UI調用只能在主線程上完成。其次,目標不是在加載ImagePicker後立即呈現。只有在用戶點擊一個按鈕後。 – user467225 2011-04-02 06:52:07

3

也許一個簡單的標誌可以做的工作?

@interface MyViewController : UIViewController 
{ 
    BOOL _pickerIsLoaded; 
} 
@end 

@implementation MyViewController 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    _pickerIsLoaded = NO; 
    [self performSelectorInBackground:@selector(initPicker) withObject:nil]; 
} 

- (void)initPicker 
{ 
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

     NSLog(@"picker start... "); 
     [self setPicker: [[UIImagePickerController alloc] init]]; 
     NSLog(@"picker done."); 

     _pickerIsLoaded = YES; 

     [pool release]; 

} 

@end