3

私のアプリでは、ボタンがタップされたときに 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に非常に慣れていないので、何かが欠けているに違いありません!

4

1 に答える 1

2

バックグラウンド スレッドから UIKit にアクセスするのは誤用です。おそらく、「読み込み中...」画面を簡単に表示できます。気にしないのが一番の策だと思います。

于 2013-02-12T18:07:12.497 に答える