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

コードは問題ありません。NSOperationとblockを使用することが将来への道であると私は思います。

私はNSOperationに精通しています。ブロックと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#>
});

さあ。NSOperationでは簡単に実行できないGCDで実行できることがありますか?

4

3 に答える 3

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

これは、-performSelector:withObject:afterDelay:のように、遅延後にブロックをトリガーするにはどうすればよいかという回答に基づいています。

カテゴリにすべきではないと思います。

不思議なことに、GCDを使用することになりました。

ただし、使用は簡単です。私はただします:

    [BGPerformDelayedBlock performSlightlyDelayedBlock:^{
        [UIView animateWithDuration:.3 animations:^{
            [self snapToTheTopOfTheNonHeaderView];
        }];
    }];
于 2012-10-25T05:31:21.007 に答える
1

NSOperationQueueは、実行を遅延させるメカニズムを提供しません。GCDまたはNSTimerを使用します。

于 2012-10-25T05:36:41.897 に答える
0

あなたのコードは、NSTimer0.01秒後にセレクターを設定して繰り返しなしで使用するのと似ています。これはメインスレッドで呼び出されます。

NSOperationまたはブロックは、バックグラウンドで操作を実行するために使用されます。これらは、の代わりに使用できますperformSelectorInBackground

バックグラウンドで作業する必要がある場合は、それを実行してください。using 'NSOperationQueue'NSOperationとブロックを学ぶために利用できる多くのチュートリアルがあります。

于 2012-10-23T06:31:37.167 に答える