ios中幾種延時處理

版本記錄

版本號 時間
V1.0 2017.05.01

前言

很多時候我們需要進(jìn)行延遲處理,在ios中延遲方法有很多慰毅,下面就介紹幾種主要的延時方法扎阶,各有優(yōu)缺點(diǎn)婶芭,希望大家能比較使用着饥。

詳情

一宰掉、perform selector方法

ios中關(guān)于這個方法有幾個方法,主要如下:

@interface NSObject (NSDelayedPerforming)

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSRunLoopMode> *)modes;
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;

@end

這個方法有個優(yōu)點(diǎn)就是不會阻塞線程孟害。此方式要求必須在主線程中執(zhí)行挪拟,否則無效,沒有取消的方法谎柄。我們就以第二個方法進(jìn)行舉例吧球切。

1. JJDelayMethodVC.m

#import "JJDelayMethodVC.h"

@interface JJDelayMethodVC ()

@end

@implementation JJDelayMethodVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor lightGrayColor];
    
    //第一種延時函數(shù)
    [self delayMethodOne];

}

#pragma mark - Object Private Function

- (void)delayMethodOne
{
    NSDate *dateBefore = [NSDate date];
    NSLog(@"dateBefore---%@",dateBefore);
    [self performSelector:@selector(delayMethodOneAction) withObject:nil afterDelay:2];

}

#pragma mark - Action

- (void)delayMethodOneAction
{
    NSDate *dateAfter = [NSDate date];
    NSLog(@"dateAfter---%@",dateAfter);

}

@end

我們看輸出。

2017-05-01 22:35:37.231 delayMethod[6783:293524] dateBefore---2017-05-01 14:35:37 +0000
2017-05-01 22:35:39.302 delayMethod[6783:293524] dateAfter---2017-05-01 14:35:39 +0000

可以看見確實(shí)延時了2s捍歪。上面這個方法的object可以傳參鸵钝,然后在執(zhí)行selector的方法中進(jìn)行接收并處理。


二变逃、GCD dispatch_after方法

GCD中dispatch_after方法也可以實(shí)現(xiàn)延遲怠堪。而且不會阻塞線程,效率較高(推薦使用)凰棉,并且可以在參數(shù)中選擇執(zhí)行的線程陌粹,同樣沒有可取消的方法。

#import "JJDelayMethodVC.h"

@interface JJDelayMethodVC ()

@end

@implementation JJDelayMethodVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor lightGrayColor];
    
    //第一種延時函數(shù)
//    [self delayMethodOne];
    
    //第二種延時函數(shù) GCD dispatch
    [self delayByDispatch];

}

#pragma mark - Object Private Function

- (void)delayByDispatch
{
    NSDate *dateBefore = [NSDate date];
    NSLog(@"dateBefore---%@",dateBefore);
    
    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC));
    dispatch_after(time, dispatch_get_main_queue(), ^{
        
        NSDate *dateAfter = [NSDate date];
        NSLog(@"dateAfter---%@",dateAfter);
    });

}

@end

我們看輸出結(jié)果或舞。

2017-05-01 22:53:14.991 delayMethod[6980:303434] dateBefore---2017-05-01 14:53:14 +0000
2017-05-01 22:53:17.992 delayMethod[6980:303434] dateAfter---2017-05-01 14:53:17 +0000

三映凳、UIView動畫實(shí)現(xiàn)延時

??我們都知道UIView可以實(shí)現(xiàn)動畫延遲,延時操作寫在block里面魏宽,這里需要說明的是,block中的代碼對于是支持animation的代碼派桩,才會有延遲效果蚌斩,對于不支持animation的代碼不會有延遲效果。

下面我們看代碼员魏。

#import "JJDelayMethodVC.h"

@interface JJDelayMethodVC ()

@property (nonatomic, strong) UILabel *titleLabel;

@end

@implementation JJDelayMethodVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 100)];
    titleLabel.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:titleLabel];
    self.titleLabel = titleLabel;
    
    self.view.backgroundColor = [UIColor lightGrayColor];
    
    //第一種延時函數(shù)
//    [self delayMethodOne];
    
    //第二種延時函數(shù) GCD dispatch
//    [self delayByDispatch];
    
    //UIView實(shí)現(xiàn)延遲
    [self delayByAnimation];

}

#pragma mark - Object Private Function

- (void)delayByAnimation
{
    NSDate *dateBefore = [NSDate date];
    NSLog(@"dateBefore---%@",dateBefore);

    [UIView animateKeyframesWithDuration:0.25 delay:5 options:UIViewKeyframeAnimationOptionLayoutSubviews animations:^{
        self.titleLabel.transform = CGAffineTransformMakeTranslation(0, 300);
    } completion:^(BOOL finished) {
        NSDate *dateAfter = [NSDate date];
        NSLog(@"dateAfter---%@",dateAfter);

        self.titleLabel.transform = CGAffineTransformIdentity;
    }];

}

@end


然后我們看輸出和gif圖撕阎。

2017-05-01 23:08:39.491 delayMethod[7238:313886] dateBefore---2017-05-01 15:08:39 +0000
2017-05-01 23:08:44.816 delayMethod[7238:313886] dateAfter---2017-05-01 15:08:44 +0000

動畫延時

??需要說明的是碌补,UIview動畫延遲是不會阻塞線程的厦章。


四、NSThread sleep方法

??這個方法也可以實(shí)現(xiàn)延時袜啃,其實(shí)就是讓該線程睡眠一段時間群发,所以它一定會阻塞線程,浪費(fèi)資源熟妓,所以一般是不推薦使用的。它沒有取消的方法,可以放在主線程或者子線程中告材,如果一定要用還是建議放在子線程中防止卡頓界面。

#import "JJDelayMethodVC.h"

@interface JJDelayMethodVC ()

@property (nonatomic, strong) UILabel *titleLabel;


@end

@implementation JJDelayMethodVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 100)];
    titleLabel.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:titleLabel];
    self.titleLabel = titleLabel;
    
    self.view.backgroundColor = [UIColor lightGrayColor];
    
    //第一種延時函數(shù)
//    [self delayMethodOne];
    
    //第二種延時函數(shù) GCD dispatch
//    [self delayByDispatch];
    
    //UIView實(shí)現(xiàn)延遲
//    [self delayByAnimation];
    
    //第四種  thread sleep方法
    [self delayByThreadSleep];

}

#pragma mark - Object Private Function

- (void)delayByThreadSleep
{
    
    NSLog(@"%@",[NSThread currentThread]);
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSDate *dateBefore = [NSDate date];
        NSLog(@"dateBefore---%@",dateBefore);
        
        [NSThread sleepForTimeInterval:3];
        
        NSDate *dateAfter = [NSDate date];
        NSLog(@"dateAfter---%@",dateAfter);
        
        NSLog(@"%@",[NSThread currentThread]);
        
    });

}

@end

看輸出結(jié)果缰猴。

2017-05-01 23:44:20.307 delayMethod[7589:330545] <NSThread: 0x60800007a340>{number = 1, name = main}
2017-05-01 23:44:20.356 delayMethod[7589:330647] dateBefore---2017-05-01 15:44:20 +0000
2017-05-01 23:44:23.432 delayMethod[7589:330647] dateAfter---2017-05-01 15:44:23 +0000
2017-05-01 23:44:23.432 delayMethod[7589:330647] <NSThread: 0x600000264e80>{number = 3, name = (null)}

五疤剑、NSTime 定時器方法

??定時器NSTimer也可以實(shí)現(xiàn)延遲隘膘,是一種非阻塞的執(zhí)行方式。取消的話可以先判斷isInvalidate然后調(diào)用invalidate取消該定時器弯菊。

我們先看代碼。

#import "JJDelayMethodVC.h"

@interface JJDelayMethodVC ()

@property (nonatomic, strong) UILabel *titleLabel;

@end

@implementation JJDelayMethodVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 100)];
    titleLabel.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:titleLabel];
    self.titleLabel = titleLabel;
    
    self.view.backgroundColor = [UIColor lightGrayColor];
    
    //第一種延時函數(shù)
//    [self delayMethodOne];
    
    //第二種延時函數(shù) GCD dispatch
//    [self delayByDispatch];
    
    //UIView實(shí)現(xiàn)延遲
//    [self delayByAnimation];
    
    //第四種  thread sleep方法
//    [self delayByThreadSleep];
    
    //第五種 timer方法
    [self delayByTimer];

}

#pragma mark - Object Private Function

- (void)delayByTimer
{
    
    NSDate *dateBefore = [NSDate date];
    NSLog(@"dateBefore---%@",dateBefore);
    
    NSLog(@"%@",[NSThread currentThread]);

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(delayByTimerAction) userInfo:nil repeats:NO];
}

- (void)delayByTimerAction
{
    NSDate *dateAfter = [NSDate date];
    NSLog(@"dateAfter---%@",dateAfter);
    
    NSLog(@"%@",[NSThread currentThread]);
}

@end

然后我們看輸出結(jié)果。

2017-05-01 23:53:38.677 delayMethod[7704:335921] dateBefore---2017-05-01 15:53:38 +0000
2017-05-01 23:53:38.677 delayMethod[7704:335921] <NSThread: 0x60800006ea00>{number = 1, name = main}
2017-05-01 23:53:41.752 delayMethod[7704:335921] dateAfter---2017-05-01 15:53:41 +0000
2017-05-01 23:53:41.753 delayMethod[7704:335921] <NSThread: 0x60800006ea00>{number = 1, name = main}

我這里沒有取消timer牛曹,大家可以自己加上醇滥。

后記

??時間就這么多了,先寫這么多吧腺办,以后有更好的東西在和大家分享。謝謝大家书妻,晚安躬拢。

送給最喜歡向日葵的你吧聊闯!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市篷帅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌魏身,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件税朴,死亡現(xiàn)場離奇詭異家制,居然都是意外死亡颤殴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門哪亿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贤笆,“玉大人,你說我怎么就攤上這事芥永。” “怎么了板辽?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵劲弦,是天一觀的道長醇坝。 經(jīng)常有香客問我,道長呼猪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任轴踱,我火速辦了婚禮谚赎,結(jié)果婚禮上诱篷,老公的妹妹穿的比我還像新娘兴蒸。我一直安慰自己细办,他們只是感情好蕾殴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茴肥,像睡著了一般荡灾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上批幌,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天荧缘,我揣著相機(jī)與錄音,去河邊找鬼信姓。 笑死绸罗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的菊值。 我是一名探鬼主播系洛,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼描扯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绽诚?” 一聲冷哼從身側(cè)響起杭煎,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卒落,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后也切,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腰湾,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡费坊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了讨越。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片永毅。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖节猿,靈堂內(nèi)的尸體忽然破棺而出漫雕,到底是詐尸還是另有隱情,我是刑警寧澤浸间,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布太雨,位于F島的核電站,受9級特大地震影響魁蒜,放射性物質(zhì)發(fā)生泄漏囊扳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一兜看、第九天 我趴在偏房一處隱蔽的房頂上張望锥咸。 院中可真熱鬧,春花似錦细移、人聲如沸搏予。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碗殷。三九已至,卻和暖如春速缨,著一層夾襖步出監(jiān)牢的瞬間锌妻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工旬牲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仿粹,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓原茅,卻偏偏與公主長得像牍陌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子员咽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1,NSObject中description屬性的意義贮预,它可以重寫嗎?答案:每當(dāng) NSLog(@"")函數(shù)中出現(xiàn) ...
    eightzg閱讀 4,144評論 2 19
  • 設(shè)計模式是什么贝室? 你知道哪些設(shè)計模式,并簡要敘述仿吞? 設(shè)計模式是一種編碼經(jīng)驗(yàn)滑频,就是用比較成熟的邏輯去處理某一種類型的...
    iOS菜鳥大大閱讀 708評論 0 1
  • 任務(wù)和線程的啟動很容易。 在大多數(shù)時候唤冈, 我們都會讓它們運(yùn)行直到結(jié)束峡迷,或者讓它們自行停止。然而你虹,有時候我們希望提前...
    好好學(xué)習(xí)Sun閱讀 1,150評論 0 0
  • 孤獨(dú)的人只是少了愛的存在绘搞, 少了共鳴得我們只留下孤獨(dú)的靈魂四處游走。 夜已深傅物,人已眠夯辖。 深夜的我們,獨(dú)坐在書桌前董饰。...
    走你的夜閱讀 366評論 0 1
  • 早上八點(diǎn)鐘蒿褂,小天被砰砰砰的敲門聲給吵醒了。大周末的卒暂,還讓不讓人睡了啄栓。這時候老媽那破鍋般的聲音傳到了耳畔,兔崽子也祠,趕...
    想飛的魚小天閱讀 351評論 1 3