【轉】iOS-延遲操作方法總結


原文網址:http://lysongzi.com/2016/01/30/iOS-%E5%BB%B6%E8%BF%9F%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93/

在實際應用中,有時候我們會需要延時執行某些操作,所以我們這里總結了四種延遲操作的方法,並簡要分析了每種方法的異同。

NSObject的相關方法

第一種方法是使用NSObject類的performSelector:withObject:afterDelay:方法,該方法可以指定延遲一段時間后執行某個特定方法。這個方法必須在主線程中執行,否則會無效。同時該方法也是非阻塞的,無法取消延遲指向?(待考證)。

[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0];

NSTimer

第二種方法可以使用NSTimer,該類也主要有三種方法生成一個NSTimer對象,其中我們可以更具需要選用合適的方法。通過該方法執行的延時操作需要在主線程中運行,也是非阻塞的方式。如果需要取消延遲執行操作,可以調用invalidate:操作停止一個計時器對象。

[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];

GCD

通過GCD的方式執行延時操作是比較靈活的,因為這種方法既可以在主線程也可以在子線程上執行,且為非阻塞的方式,不足之處是尚無取消延遲操作的方法。

double delayInSeconds = 3.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^{
    [self delayMethod];
});

NSThread

這種方法是很簡單除暴的,就是讓線程休眠一段時間,然后再執行需要的操作。因此這種方法是阻塞式的,不推薦在主線程中使用,因為會造成UI卡頓。可以在子線程是使用。暫無取消方法。

[NSThread sleepForTimeInterval:1.0];
[self delayMethod];

Demon

#import "ViewController.h"    
@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //第一種方法
    //在主線程執行,否則無效;非阻塞;無法取消
    [self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0];

    //第二種方法
    //主線程中執行,否則無效;非阻塞;可以調用invalidate方法取消
    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];

    //第三種方法
    //可選擇執行的線程;非阻塞;無法取消
    double delayInSeconds = 3.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^{
        [self delayMethod];
    });

    //第四種方法
    //主線程子線程都可以;阻塞;無法取消
    [NSThread sleepForTimeInterval:1.0];
    [self delayMethod];
}

- (void)delayMethod
{
    NSLog(@"Excute.");
}

@end

然后哦我們可以看到結果輸出.

2016-01-30 20:54:27.822 DelayPerformSelector[2079:319217] Excute.
2016-01-30 20:54:27.830 DelayPerformSelector[2079:319217] Excute.
2016-01-30 20:54:28.820 DelayPerformSelector[2079:319217] Excute.
2016-01-30 20:54:29.818 DelayPerformSelector[2079:319217] Excute.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM