变更记录

序号 录入时间 录入人 备注
1 2015-03-02 Alfred Jiang -
2 2015-12-18 Alfred Jiang -

方案名称

时间 - 延时执行解决方案

关键字

时间 \ 延时执行

需求场景

  1. 部分需要延时等待的操作

参考链接

  1. 博客园 - iOS延时执行的几种方法

详细内容

  1. 直接使用 performSelector
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    - (void)checkRefreshCatalogViewData
    {
    [catalogView performSelector:@selector(refreshDataAfterFiveMinute) withObject:nil afterDelay:kRefreshCatalogViewDelayTime];
    }

    //对于代码中调用performSelector产生延时操作的代码,如果不是通过category方式定义,要在dealloc函数里面用cancelPreviousPerformRequestsWithTarget取消。因为不取消的话,如果页面在延时的时间内退出,将因为找不到执行函数而崩溃。

    - (void)dealloc
    {
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(refreshDataAfterFiveMinute) object:nil];
    [super dealloc];
    }
  2. Block + performSelector
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @implementation NSObject (PerformBlockAfterDelay)

    - (void)performBlock:(void (^)(void))block
    afterDelay:(NSTimeInterval)delay
    {
    block = [block copy];
    [self performSelector:@selector(fireBlockAfterDelay:)
    withObject:block
    afterDelay:delay];
    }

    - (void)fireBlockAfterDelay:(void (^)(void))block {
    block();
    }

    @end
  3. GCD
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //Swift 解决方案
    func delay(delay:Double, closure:()->()) {
    dispatch_after(
    dispatch_time(
    DISPATCH_TIME_NOW,
    Int64(delay * Double(NSEC_PER_SEC))
    ),
    dispatch_get_main_queue(), closure)
    }

    //Objective-C 解决方案
    - void RunBlockAfterDelay(NSTimeInterval delay, void (^block)(void))
    {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*delay),
    dispatch_get_main_queue(), block);
    }
  4. 用 animation 的 completion 参数 (不推荐)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [UIView animateWithDuration:0.0
    delay:5.0
    options:UIViewAnimationOptionAllowUserInteraction
    animations:^{
    //
    }
    completion:^(BOOL finished) {
    //do stuff here
    }];
  5. 使用 NSOperationQueue ,在应用程序的下一个主循环执行 (不推荐)
    1
    [[NSOperationQueue mainQueue] addOperationWithBlock:aBlock];
    这个和调用 performSelector: with afterDelay of 0.0f 等价

效果图

(无)

备注