0

如何使背景线程在另一个后台线程完成之前不工作,以及如何使其在第一个后台线程完成后启动它的线程

4

2 回答 2

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 回答
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 回答