用于完成块的Objective-C计时器

边秀宝

我有一个需要完成块的函数。但是,有可能发生错误,并且永远不会调用完成块。我想有一个超时计时器来处理未及时调用完成块的情况,因此我仍然可以继续执行其他操作。

void(^completeHandler)(void) = ^
{
    NSLog(@"Complete");
};

//Timer here to check if completeHandler will ever get called in a specific amount of time

[self complete:completeHandler];
哈米什

正如FreeNickname所说,您可能正在从错误的方向解决此问题。

等待完成块返回的结果几乎没有达到首先使用完成块的目的!

不应使用计时器来检查是否已调用完成功能,而应将错误和/或成功参数添加到完成功能块中。

例如:

-(void) doSomethingWithCompletion:(void(^)(BOOL success, NSError* error))completion {

    // do something asynchronous

    {
        { // if success
            completion(YES, nil);
        }

        { // if fail
            NSError* error = ...
            completion(NO, error);
        }
    }
}

...


[self doSomethingWithCompletion:^(BOOL success, NSError* error) {

    if (success) { // success
        // do some success stuff
    } else { // fail
        // do some failure stuff
    }
}];

如果您要处理自己要设置超时的请求,则始终可以使用adispatch_after来调度完成块以不成功的参数触发-并将其包装在另一个块中以确保只能被调用一次。例如:

-(void) doSomethingWithCompletion:(void(^)(BOOL success, NSError* error))completion {

    __block BOOL called = NO;

    void(^completionBlock)(BOOL success, NSError* error) = ^(BOOL success, NSError* error){
        if (!called) {
            completion(success, error);
            called = YES;
        }
    };


    // do something asynchronous

    {
        { // if success
            completionBlock(YES, nil);
        }

        { // if fail
            NSError* error = ...
            completionBlock(NO, error);
        }
    }

    // your timeout
    dispatch_time_t time =  dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
    dispatch_after(time, dispatch_get_main_queue(), ^{
        completionBlock(NO, nil);
    });

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多个计时器Objective-C

来自分类Dev

Objective-C:完成间隔计时器

来自分类Dev

在计时器完成块中不更新变量

来自分类Dev

带有完成块的Objective-C方法返回要在完成块中使用的值

来自分类Dev

如何编写一个Objective-C完成块

来自分类Dev

如何使计时器等待完成?

来自分类Dev

Angular JS(用于循环)计时器

来自分类Dev

将 Edittext 用于倒数计时器

来自分类Dev

在Objective-C中另一个线程中的计时器

来自分类Dev

您如何在Objective-C中将计时器显示为屏幕上的标签?

来自分类Dev

jQuery.countdown在计时器完成时使用按钮启动新计时器

来自分类Dev

在C#中将Graphics.DrawString用于计时器时,如何减少闪烁?

来自分类Dev

在C#中将Graphics.DrawString用于计时器时,如何减少闪烁?

来自分类Dev

C#-控制台中的显示倒数计时器,用于通过ReadLine()进行用户输入

来自分类Dev

Wildfly计时器服务-无法创建用于计时器持久性的表

来自分类Dev

如何在Objective-C iOS中等待完成块完成

来自分类Dev

如何在Objective-C iOS中等待完成块完成

来自分类Dev

Android:无论以前的计时尚未完成,计时器都会计时吗?

来自分类Dev

倒数计时器-想要达成完成通知

来自分类Dev

甜蜜警报计时器-完成功能

来自分类Dev

在Blazor应用中完成计时器后显示消息

来自分类Dev

完成后如何重置计时器组件

来自分类Dev

如何创建与Objective-C完成块等效的C ++作为参数

来自分类Dev

尝试将Objective C完成块移植到Swift中的问题

来自分类Dev

如何将Objective-C的完成块转换为Swift?

来自分类Dev

如何在objective-c中的完成块上传递参数

来自分类Dev

是否可以将完成块传递给Objective-C中的委托参数?

来自分类Dev

如何在objective-c中的完成块上传递参数

来自分类Dev

圆形进度条(用于倒数计时器)

Related 相关文章

  1. 1

    多个计时器Objective-C

  2. 2

    Objective-C:完成间隔计时器

  3. 3

    在计时器完成块中不更新变量

  4. 4

    带有完成块的Objective-C方法返回要在完成块中使用的值

  5. 5

    如何编写一个Objective-C完成块

  6. 6

    如何使计时器等待完成?

  7. 7

    Angular JS(用于循环)计时器

  8. 8

    将 Edittext 用于倒数计时器

  9. 9

    在Objective-C中另一个线程中的计时器

  10. 10

    您如何在Objective-C中将计时器显示为屏幕上的标签?

  11. 11

    jQuery.countdown在计时器完成时使用按钮启动新计时器

  12. 12

    在C#中将Graphics.DrawString用于计时器时,如何减少闪烁?

  13. 13

    在C#中将Graphics.DrawString用于计时器时,如何减少闪烁?

  14. 14

    C#-控制台中的显示倒数计时器,用于通过ReadLine()进行用户输入

  15. 15

    Wildfly计时器服务-无法创建用于计时器持久性的表

  16. 16

    如何在Objective-C iOS中等待完成块完成

  17. 17

    如何在Objective-C iOS中等待完成块完成

  18. 18

    Android:无论以前的计时尚未完成,计时器都会计时吗?

  19. 19

    倒数计时器-想要达成完成通知

  20. 20

    甜蜜警报计时器-完成功能

  21. 21

    在Blazor应用中完成计时器后显示消息

  22. 22

    完成后如何重置计时器组件

  23. 23

    如何创建与Objective-C完成块等效的C ++作为参数

  24. 24

    尝试将Objective C完成块移植到Swift中的问题

  25. 25

    如何将Objective-C的完成块转换为Swift?

  26. 26

    如何在objective-c中的完成块上传递参数

  27. 27

    是否可以将完成块传递给Objective-C中的委托参数?

  28. 28

    如何在objective-c中的完成块上传递参数

  29. 29

    圆形进度条(用于倒数计时器)

热门标签

归档