2011-12-07 5 views
4

私はUIImagePickerControllerをポップアップし、ユーザーは写真を撮って、使用ボタンを押します。ピッカーはイメージが処理されている間にカスタムサムネイルスピナーを表示するように却下し、スピナーは最後の実際のサムネイルに置き換えられます。処理。なぜios5ですぐにUIImagePickerControllerを却下しないのですか?

少なくとも、iOS4でどのように動作したかです。 iOS5では、処理が完了するまで処理が行われ、すべて正常に動作します。しかし、私はそこにスピナーを置いて、ユーザーは何かが起こっていることを知っている。そうでなければ、それはちょうどハングアップしたように見える。この

- (void) actionSheet: (UIActionSheet *)actionSheet didDismissWithButtonIndex (NSInteger)buttonIndex { 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.delegate = self; 
    picker.allowsEditing = NO; 
    // yada, yada, yada 
    [self presentModalViewController:picker animated:YES]; 
    [picker release]; 
} 

そして

は、ユーザが「使用」を選ぶときに呼び出される:

だから私は、この持っている

- (void) imagePickerController: (UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    [self dismissModalViewControllerAnimated:YES]; 
    [self performSelectorOnMainThread:@selector(processImage:) withObject:info waitUntilDone:NO]; 
    animate = true; 
} 

をし、このサムネイルが回転している間、処理を実行するために呼び出されます:

- (void) processImage:(NSDictionary *)info 
{ 
    UIImage *image = nil; 
    NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 
    // processing of image 
    animate = false; 
    [activityImageView stopAnimating]; 
    [activityImageView release]; 
    [self.tableView reloadData]; 
} 

私が言ったように、それはiOS4と完全に機能しましたが、iOS5ではそのような運がありませんでした。だから何が問題なの?イメージピッカーは最終的に解雇されるので、すぐに解雇されないのはなぜですか?

+0

を...' dispatch_async 'と(dispatch_get_main_queue()、^ {[self processImage:info];}); '? – NJones

+0

良い考えですが、同じ動作です。少なくとも私は何か新しいことを学んだ! – mutatron

答えて

4

この時点でなぜiOS4 & iOS5の間に相違があるのか​​わかりません。しかし、UIがぶら下がっているというあなたの説明は、あなたが示したコードとかなり一致しています。メインスレッドの実行セレクタは、メインスレッド(呼び出し元のスレッド)でセレクタを実行するだけです。この設定のため、waitUntilDone:NOは別のスレッドに送信されていないため意味がありません。単に順番に実行されています。

[self dismissModalViewControllerAnimated:YES]; 
animate = true; 
[self performSelectorOnMainThread:@selector(processImage:) withObject:info waitUntilDone:NO]; 

をしかし、私は// processing of imageは何の並行性を含んでいないと仮定しているので、これは最高の状態で危険であろうことに注意してください:あなたはおそらく、あなたがそうのように、順序を入れ替えるからちょうど望む結果になるだろう。私は並行性のためのブロックを好む。そして、私は好きなものの上に、たとえば、従うことは同時実行を容易にするためにブロックをネストされた:

-(void)doSomeStuffInBackground{ 
    // Prepare for background stuff 
    dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
     // Do background stuff 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Update UI from results of background stuff 
     }); 
    }); 
} 

だから、このことを念頭に置いて、私はもっとこのような何かを示唆している:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 
    [self dismissModalViewControllerAnimated:YES]; 
    [self processImage:info]; 
} 

-(void)processImage:(NSDictionary *)info{ 
    animate = true; 
    UIImage *image = nil; 
    NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 

    dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
     // processing of image here on background thread 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      // update UI here on main thread 
      animate = false; 
      [activityImageView stopAnimating]; 
      [activityImageView release]; 
      [self.tableView reloadData]; 
     }); 
    }); 
} 

これはですバックグラウンドスレッドにメインワークをオフロードして、UIを応答可能にします。

+0

パーフェクト!それはまさに私が欲しいものです。私も何かを学びました。実際に、私は今習った授業でそれを学んだことを覚えていますが、それは私に付いていないと思います。ありがとう! – mutatron

0

[[picker presentingViewController] dismissViewControllerAnimated:YES completion:nil]; 

の代わりに使用してみてください:それは問題でなければならない理由は、私が本当に知りませんが、あなたは `[自己performSelectorを交換しようとしている

[[picker parentViewController] dismissModalViewControllerAnimated: YES]; 
+0

ようこそスタックオーバーフロー!あなたのポストに感謝します!あなたの投稿にシグネチャ/タグラインを使用しないでください。あなたのボックスはあなたの署名として数えられ、あなたのプロフィールを使って好きな自分に関する情報を投稿することができます。 [署名/タグラインに関するよくある質問](http://stackoverflow.com/faq#signatures) –

関連する問題