【问题标题】:performSelector:withObject:afterDelay: within NSOperationperformSelector:withObject:afterDelay: 在 NSOperation 内
【发布时间】:2011-12-30 14:01:27
【问题描述】:

我正在由NSOperationQueue 管理的一些NSOperation 对象中执行一些代码。该代码还包含使用performSelector:withObject:afterDelay: 的延迟方法调用。

问题是,应该被延迟调用的相应选择器根本不被调用

读过this answer to a StackOverflow question,我猜这是因为NSOperation 已经完成并且它的线程甚至不再存在,“忘记”了对选择器的预定调用。

我该如何解决这个问题? 如何延迟调用NSOperation 中的方法?

【问题讨论】:

    标签: ios concurrency nsoperation performselector


    【解决方案1】:

    一种可能是使用 Grand Central Dispatch,即dispatch_after()

    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_after(popTime, queue, ^{
        ...
    });
    

    除了dispatch_get_global_queue(),您当然也可以创建自己的调度队列或将主队列与dispatch_get_main_queue() 一起使用。

    【讨论】:

    • 由于我对NSOperationQueue 和更多GCD 都是新手,这是一个相当愚蠢的问题:我可以以某种方式使用NSOperationQueue,当前的NSOperation 正在执行,如GCD的延迟调度的调度队列?
    • 上面的代码不适用于dispatch_get_global_queue,但它适用于dispatch_get_main_queue。知道为什么吗?
    • 我对GCD不是很了解,所以不完全理解排队到GCD对retain/release过程的影响,但我猜你原来的问题是人脸沉淀的NSOperation 中的所有对象都已释放。如果您搜索与在 NSOperation 中使用异步 NSURLConnection 相关的问题,您将看到与维护指向对象的指针相关的变通方法,以防止 NSOperation 完成。
    • 不一样,因为以后可以取消一个performSelector:withObject:afterDelay:,但是不能取消dispatch_after()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多