おはようございます。
見習いプログラマーの「naopon」です。
干し芋、芋けんぴ、さつまいも全般をこよなく好きです。
「dispatchってどうやってCancelするの?」っていう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#pragma mark - #pragma mark [簡易]遅延実行 - (void(^)(void))asyncAfterDelay:(NSTimeInterval)delay block:(void(^)(void))block { return [self asyncAfterDate:[NSDate dateWithTimeIntervalSinceNow:delay] block:block]; } - (void(^)(void))asyncAfterDate:(NSDate *)date block:(void(^)(void))block { __block dispatch_queue_t _queue = dispatch_queue_create("com.itcowork.dispatch.after.queue", DISPATCH_QUEUE_CONCURRENT); __block dispatch_source_t _source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, _queue); //実行処理を登録 dispatch_source_set_event_handler(_source, ^{ dispatch_async(dispatch_get_main_queue(), ^{ block(); if (_source) { dispatch_source_cancel(_source); } }); }); //キャンセル処理を登録 dispatch_source_set_cancel_handler(_source, ^{ #if !(OS_OBJECT_USE_OBJC && __has_feature(objc_arc)) if (_source) { dispatch_release(_source); } if (_queue) { dispatch_release(_queue); } #endif _source = NULL; _queue = NULL; }); void(^cancel_block)(void) = ^{ if (_source) { dispatch_source_cancel(_source); } }; //指定秒後のタイム dispatch_time_t delta = getDispatchTimeByDate(date); //指定秒後にタイマーを設定する dispatch_source_set_timer(_source, delta, NSEC_PER_SEC, 0); dispatch_resume(_source); //キャンセル用ブロックを返却 return cancel_block; } dispatch_time_t getDispatchTimeByDate(NSDate *date) { NSTimeInterval interval; double second, subsecond; struct timespec time; dispatch_time_t milestone; interval = [date timeIntervalSince1970]; subsecond = modf(interval, &second); time.tv_sec = second; time.tv_nsec = subsecond * NSEC_PER_SEC; milestone = dispatch_walltime(&time, 0); return milestone; } |
使い方は。。。
1 2 3 4 5 6 7 |
//遅延実行 void(^cancel_block)(void) = [self asyncAfterDelay:60.0f block:^{ //60秒後に実行する処理 }]; //キャンセル cancel_block(); |
こんな感じでいつも使ってます。
カテゴリーとかにしとくと便利かも。
勉強するときに参考にした書籍を紹介しているページがありました。~~感謝~~
『エキスパートObjective-Cプログラミング – iOS/OS Xのメモリ管理とマルチスレッド』