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很新,所以我必須錯過一些東西!
這是一個濫用UIKit從後臺線程訪問它。您可以簡要地顯示「加載...」屏幕。我個人並不擔心。 – nielsbot
好的!你是對的這不是一個大問題我只是想知道是否有可能優化,謝謝你的回答! – BigLex
@nielsbot請考慮重申,在一個答案或BigLex中,考慮回答自己的問題,這樣就不會永遠坐在未答覆的列表上。 – ipmcc