2

私はそれを呼び出すたびに5秒の遅延を作る必要がある方法を持っています。最初に私はそれを作成しますsleep(5);-それはうまく機能しましたが、私は信じています-それはobj-cの方法ではないので、GCDの助けを借りてそれを書き込もうとしました. このプロシージャの最初の呼び出しは約 5 秒の遅延を生じますが、このキュー内の他の呼び出しは遅延なく次々と実行されます。この問題を解決するには?

- (void) buyItemAtUUID:(NSString*)UUID
{
    dispatch_barrier_async(dataManagerQueue, ^{
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
        double delayInSeconds = 5.0;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
        dispatch_after(popTime, dataManagerQueue, ^(void){
            NSInteger path = [self indexFromObjectUUID:UUID];
            if (path != NSNotFound)
            {
                NSMutableDictionary *item = [[_items objectAtIndex:path] mutableCopy];
                NSNumber *value = [NSNumber numberWithFloat:[[item objectForKey:@"Quantity"] floatValue] - 1.0];
             }
        });
    });
}
4

2 に答える 2

2

このプロシージャの最初の呼び出しは約 5 秒の遅延を生じますが、このキュー内の他の呼び出しは遅延なく次々と実行されます。

これは通常、望ましい動作です。呼び出してはいけない理由はsleep()、スレッドがブロックされ、そのスレッドで他のことが起こらなくなるからです。メイン スレッドをブロックすると、デバイスがフリーズしたように見えますが、これはユーザー エクスペリエンスとしてはあまり良くありません。

GCD は、dispatch_group_wait()あるタスクのセットを他のグループが終了するまで待機させることができる便利な機能を提供します。例として、キューに入れられたタスクのグループの待機を見てください。

于 2013-09-10T09:48:43.107 に答える
1

dispatch_barrier_asyncこのブロックの実行に並行キューに追加されたブロックのみを停止します。すでにキューに入れられたブロックの実行は妨げられません。

于 2013-09-10T09:57:15.423 に答える