【问题标题】:How to call method with delay and in background thread如何在后台线程中延迟调用方法
【发布时间】:2012-06-25 02:59:13
【问题描述】:

我有一个我想在-viewDidLoad 之后和后台线程中调用的方法。有没有办法将这两种方法结合起来:

[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]

[self performSelectorInBackground:(SEL) withObject:(id)]?

【问题讨论】:

  • 你试过Xcode的自动填充吗?太奇妙了! example here

标签: iphone objective-c ios


【解决方案1】:

尝试以下方法:

// Run in the background, on the default priority queue
dispatch_async( dispatch_get_global_queue(0, 0), ^{
    [self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]
});

代码未测试

请注意,您的选择器/方法不得使用 UIKit(因此不要更新 UI)或访问 UIKit 属性(如框架),因此您的选择器可能需要重新开始工作回到主线程。例如

(id)SomeMethod:UsingParams: {

    // Do some work but the results

    // Run in the background, on the main queue
    dispatch_async(dispatch_get_main_queue(), ^{
        // Do something UIKit related
    });
}

【讨论】:

  • +1 表示不应从后台线程中触摸 UI。
【解决方案2】:

您可以按照示例执行此操作:

dispatch_time_t delay = dispatch_time( DISPATCH_TIME_NOW, <delay in seconds> * NSEC_PER_SEC );
dispatch_after( delay, dispatch_get_main_queue(), ^{
    [self performSelectorInBackground: <sel> withObject: <obj>]
});

不知何故混合解决方案。最好坚持使用完整的 GCD 方法。

【讨论】:

    【解决方案3】:

    Grand Central Dispatch 有dispatch_after(),它将在指定队列的指定时间后执行一个块。如果您创建一个后台队列,您将拥有您想要的功能。

    dispatch_queue_t myBackgroundQ = dispatch_queue_create("com.romanHouse.backgroundDelay", NULL);
    // Could also get a global queue; in this case, don't release it below.
    dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC);
    dispatch_after(delay, myBackgroundQ, ^(void){
        [self delayedMethodWithObject:someObject];
    });
    dispatch_release(myBackgroundQ);
    

    【讨论】:

    • 您好,先生,我阅读了文档并得到“没有后台方法可以在 30 秒后运行”,您能帮忙吗?
    【解决方案4】:
    [self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]
    

    在被调用的线程上执行选择器。因此,当您从后台线程调用它时,它将在那里运行...

    【讨论】:

    • 问题是在后台线程中单独使用[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]时,没有运行
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多