2013-02-07 24 views
3

在我的應用程序中,我需要在點擊按鈕時顯示UIImagePickerController。這裏是我在由所述控制器上的按鈕調用的方法使用時,它被按下的代碼:如何在控制器出現時初始化對象而不會阻止用戶界面使用GCD

- (IBAction)choosePressed:(id)sender { 
    if (!self.pickerController) self.pickerController = [[UIImagePickerController alloc]init]; 
     self.pickerController.delegate = self; 
     self.pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     [self.navigationController presentViewController:self.pickerController animated:YES completion:nil]; 
} 

問題是,UIImagePickerControllers是加載很慢,所以我想移動拾取器中的初始化viewDidAppear:animated方法,可能在另一個線程,會一直以固定的創建過程的好方法/顯示選擇器,所以我這樣做:

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    dispatch_queue_t myQueue = dispatch_queue_create("Picker Queue", NULL); 
    dispatch_async(myQueue, ^{ 
    self.pickerController = [[UIImagePickerController alloc]init]; 
    self.pickerController.delegate = self; 
    }); 
} 

- (IBAction)choosePressed:(id)sender { 
    self.pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    [self.navigationController presentViewController:self.pickerController animated:YES completion:nil]; 
} 

與此pickerController當按下按鈕可立即顯示出來,但當主控制器加載時,UI會凍結一點點(可能是因爲啓動pickerController的嘶嘶聲),但init應該在另一個線程中完成,因爲我使用dispatch_async機制不應該嗎?我的代碼中有任何錯誤嗎?

我對GCD很新,所以我必須錯過一些東西!

+2

這是一個濫用UIKit從後臺線程訪問它。您可以簡要地顯示「加載...」屏幕。我個人並不擔心。 – nielsbot

+0

好的!你是對的這不是一個大問題我只是想知道是否有可能優化,謝謝你的回答! – BigLex

+1

@nielsbot請考慮重申,在一個答案或BigLex中,考慮回答自己的問題,這樣就不會永遠坐在未答覆的列表上。 – ipmcc

回答

2

這是一個濫用UIKit從後臺線程訪問它。您可以簡要地顯示「加載...」屏幕。我認爲最好的政策是不要擔心。

相關問題