0

iOS アプリで取得したいくつかのバックグラウンド スレッドを同期する必要がありました。コードの実行を線形に保つために、一方のスレッドの実行を保持し、もう一方のスレッドがそのジョブを実行する何かが必要でした。

私は一日中このコードと戦っていましたが、たくさん読んだ後、このコードを思いつきました:

-(void)waitOne:(double)timeout
{
if (!shouldRun)
{
    shouldRun = true;

    double runs = 0;
    do {
        NSDate* next = [NSDate dateWithTimeIntervalSinceNow:0.5];
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:next];
        runs++;
    } while ((runs/2) < timeout && shouldRun);
}
else
{
    @throw [NSException exceptionWithName:@"InvalidHandle" reason:@"The currenct handle is in use" userInfo:nil];
}
}

私はそれが仕事を成し遂げたとあなたに言うことができます。しかし、そのアルゴリズムのアイデアを見つけたフォーラムで、「ループがビジー状態になる」という悪いフィードバックもいくつか見つかりましたが、それは悪い考えでした。だから、ここに聞きに来ました。私が望むものを達成するためのより良い方法はありますか?

4

2 に答える 2

0

[NSCondition] を調べて、スレッドを待機して通知できるようにします

基本的に、NSCondition を割り当て、ブロック内に [条件待機] があります。これにより、スレッドが待機します。次に、非同期操作が完了したら、[条件信号] を呼び出します。これは、待機中のスレッドに続行するように通知します。

http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/NSCondition_class/Reference/Reference.html

于 2013-06-07T05:39:57.253 に答える
0

今後の参考のために、誰かが必要な場合は、私のコードがどのようになったかを次に示します。

@implementation WaitHandle

@synthesize isWaiting;

-(void)waitOne:(double)timeout
{
    if (!isWaiting)
    {
        isWaiting = true;
        if (timeout <= 0) {
            timeout = 0.1;
        }
        [handle waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeout]];
    }
}

-(void)signal
{
    [handle signal];
}

-(id)init
{
    self = [super init];
    if (self != nil)
    {
        isWaiting = false;
        handle = [[NSCondition alloc] init];
    }
    return self;
}

-(void)dealloc
{
    [self signal];
}
@end
于 2013-06-07T12:56:11.857 に答える