0

別のバックグラウンド スレッドが完了するまでバックグラウンド スレッドが機能しないようにする方法と、最初のバックグラウンド スレッドが完了するとそのスレッドを開始するようにする方法

4

2 に答える 2

2

私のコメントで述べたように、GCDのシリアルディスパッチキューを使用できます。デモ用のサンプルコードは次のとおりです。

- (IBAction)buttonSerialQ2Pressed:(id)sender 
{
    dispatch_queue_t serialdQueue;
    serialdQueue = dispatch_queue_create("com.mydomain.testbed.serialQ2", NULL);
    dispatch_async(serialdQueue, ^{
        //your code here
        [self method1];
    });
    dispatch_async(serialdQueue, ^{
        //your code here
        [self method2];
    });
    dispatch_async(serialdQueue, ^{
        //your code here
        [self method2];
    });
    dispatch_async(serialdQueue, ^{
        //your code here
        [self method3];
    });
}

-(void)method1
{
    for (int i=0; i<1000; i++) 
    {
        NSLog(@"method1 i: %i", i);
    }
}

-(void)method2
{
    for (int i=0; i<10; i++) 
    {
        NSLog(@"method2 i: %i", i);
    }
}

-(void)method3
{
    for (int i=0; i<100; i++) 
    {
        NSLog(@"method3 i: %i", i);
    }
}
于 2012-06-04T13:51:31.173 に答える
2

以下に示すようなタイプのイベントを処理するには、フラグを使用します。

BOOL isYourthreadexecuting = NO;

- (void)beginThread {   
    isYourthreadexecuting = YES;

    [self performSelectorInBackground:@selector(backgroundThread) withObject:nil];
}
- (void)backgroundThread {
    [myClass performLongTask];

    // Done!
    isYourthreadexecuting = NO;
}
- (void)waitForThread {
    if (! isYourthreadexecuting) {
        // Thread completed
        [self callyourmethod];
    }
}

編集済み>>使用コメントに応じた追加

マルチスレッドにはNSOperationQueueを使用することをお勧めします。

願わくば、これはあなたになります...

于 2012-05-05T10:48:20.947 に答える