iOS中延遲執(zhí)行一般有三種方法:performSelector瓶蚂,NSTimer碗誉,dispatch_after
一:performSelector
延遲方法:[self performSelector:@selector(startP) withObject:nil afterDelay:3.0];
取消延遲:
方法一:這里需要注意參數(shù)需保持一致灯谣,否則取消失敗
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(startP) object:nil];
方法二:可以取消所有的延遲調(diào)用
[NSObject cancelPreviousPerformRequestsWithTarget:self ];
可能遇到的問題:cancelPreviousPerformRequestsWithTarget不管用,計(jì)時(shí)依然執(zhí)行辱士,這是因?yàn)閜erformSelector和cancelPreviousPerformRequestsWithTarget必須在同一個(gè)線程中執(zhí)行才可以
dispatch_async(dispatch_get_main_queue(),^{
? ? [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(startP) object:nil];
//或者
//[NSObject cancelPreviousPerformRequestsWithTarget:self ];
});
二:NSTimer
延遲方法:
self.timer=[NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(startP) userInfo:nil repeats:NO];
取消方法:[self.timer invalidate];self.timer=nil;
三:dispatch_after
延遲方法:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{//主線程
? ? ? //要執(zhí)行的操作//延遲兩秒后執(zhí)行
? ? });
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_global_queue(), ^{
? ? ? //要執(zhí)行的操作//延遲兩秒后執(zhí)行
? ? });
暫無取消
四:sleepForTimeInterval
[NSThread sleepForTimeInterval:1];
這個(gè)方法會(huì)阻塞主線程