【Objective-C】モーダルビューを出したりを含む処理に時間がかかる系タスク達が終了したと同時に処理を行う書き方について(モーダルビューの出す処理を待ってくれたのかも含めて)【Xcode10.2対応】

こういう人に向けて発信しています。
・複数の処理が終わるまで待ってほしい人
・モーダルビューを出す処理まで待ってほしい人
・Objective-C中級者

まずはコードをご覧ください。

#import "ViewController.h"
#import "ModalViewController.h"

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
}

- (IBAction)buttonTapEvent:(UIButton *)sender {
   [self showModal];
   dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
   dispatch_group_t group = dispatch_group_create();

   dispatch_group_async(group, queue, ^{
       [self showModal];
   });

   dispatch_group_async(group, queue, ^{
       for(int i=0; i<10000; i++){
           NSLog(@"forでログ吐いています。");
       }
   });

   //上記taskが終わってから処理される内容
   dispatch_group_notify(group, dispatch_get_main_queue(), ^{
       [self dismissViewControllerAnimated:YES completion:nil];
       NSLog(@"the:END");
   });
}

-(void)showModal{
   ModalViewController *secondVC = [[ModalViewController alloc] init];
   [self presentViewController: secondVC animated:YES completion: nil];
}

@end

解説

A:モーダルを出す処理
B:ログを10000回吐き出す処理

上記処理が終わったらモーダルが閉じる処理を書いています。

気になった点

   //上記taskが終わってから処理される内容
   dispatch_group_notify(group, dispatch_get_main_queue(), ^{
       [self dismissViewControllerAnimated:YES completion:nil];
       NSLog(@"the:END");
   });

こちらのメソッドの処理が終わったタイミングという点が気になりました。
というのも、モーダルビューを出すという処理を呼び出した直後に呼ばれるのか、それともモーダルビューを実際に出し終えた後に呼び出されるのかが不明だったからです。

実際の挙動

・モーダルビューを出し終えた後に呼び出されます。


いいなと思ったら応援しよう!