私のアプリでは、ボタンがタップされたときに UIImagePickerController を表示する必要があります。コントローラーのボタンが押されたときに呼び出されるメソッドで使用したコードは次のとおりです。
- (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];
}
これにより、ボタンが押されるとピッカーコントローラーがすぐに表示されますが、メインコントローラーがロードされると、UI が少しフリーズします (おそらくピッカーコントローラーの初期化のため)。メカニズムではないでしょうか。私のコードに間違いはありますか?
私はGCDに非常に慣れていないので、何かが欠けているに違いありません!