与NSOperation相比,这相当于什么呢?

时间:2012-10-23 03:19:00

标签: objective-c nsoperation xcode4.5 nsoperationqueue

[self performSelector:@selector(stopPulling) withObject:nil afterDelay:0.01];

代码很好。我只是认为使用NSOperation和block应该是未来的发展方向。

我熟悉NSOperation。我只想用block和NSOperation做同样的事情。

我可以用GCD做到这一点:

int64_t delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    <#code to be executed on the main queue after delay#>
});

拜托。在NCD操作中,有些事情可以在GCD中完成吗?

3 个答案:

答案 0 :(得分:1)

我最终做到了这一点:

#import "BGPerformDelayedBlock.h"

@implementation BGPerformDelayedBlock


+ (void)performDelayedBlock:(void (^)(void))block afterDelay:(NSTimeInterval)delay
{
    int64_t delta = (int64_t)(1.0e9 * delay);
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delta), dispatch_get_main_queue(), block);
}

+(void)performSlightlyDelayedBlock:(void (^)(void))block
{
    [self performDelayedBlock:block afterDelay:.1];
}
@end

它基于How do you trigger a block after a delay, like -performSelector:withObject:afterDelay:?

中的答案

我认为它不应该是一个类别。

奇怪我最终使用了GCD。

然而,使用它很简单。我只是这样做:

    [BGPerformDelayedBlock performSlightlyDelayedBlock:^{
        [UIView animateWithDuration:.3 animations:^{
            [self snapToTheTopOfTheNonHeaderView];
        }];
    }];

答案 1 :(得分:1)

NSOperationQueue不提供延迟执行的机制。使用GCD或NSTimer。

答案 2 :(得分:0)

您的代码类似于,使用NSTimer设置选择器0.01秒后没有重复。这将在主线程上调用。

NSOperation或块用于在后台执行操作。您可以使用这些代替performSelectorInBackground

如果您需要在后台工作,那就去吧。有很多教程可以学习'NSOperation using 'NSOperationQueue和块。