0
-(void) test{
    for(Person *person in persons){
        __block CGPoint point;
        dispatch_async(dispatch_get_main_queue(), ^{
            point = [self.myview personToPoint:person];
        });
        usePoint(point); // take a long time to run
    }
}

我需要personToPoint()在主队列中运行才能明白这一点,并且usePoint()方法不需要在主队列中运行并且需要很长时间才能运行。但是,在运行时usePoint(point),由于使用了 dispatch_async,因此尚未为 point 赋值。如果使用 dispatch_sync 方法,程序会被阻塞。分配后如何使用积分?

更新:如何实现以下代码的模式:

-(void) test{
    NSMutableArray *points = [NSMutableArray array];
    for(Person *person in persons){
        __block CGPoint point;
        dispatch_async(dispatch_get_main_queue(), ^{
            point = [self.myview personToPoint:person];
            [points addObject:point];
        });
    }
    usePoint(points); // take a long time to run
}
4

1 回答 1

1

像下面这样的东西会起作用。您也可以将整个 for 循环放在一个 dispatch_async() 中,让主线程一次调度所有 usePoint() 函数。

-(void) test{
    for(Person *person in persons){
        dispatch_async(dispatch_get_main_queue(), ^{
            CGPoint point = [self.myview personToPoint:person];
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                usePoint(point); // take a long time to run
            });
        });
    }
}

更新问题的解决方案:

您使用与上面建议的相同的基本模式。也就是说,您将需要在主线程上执行的操作分派给主线程,然后将分派嵌套回主线程分派中的默认工作队列。因此,当主线程完成其工作时,它将分派耗时的部分以在其他地方完成。

-(void) test{
    dispatch_async(dispatch_get_main_queue(), ^{
        NSMutableArray *points = [NSMutableArray array];
        for (Person *person in persons){
            CGPoint point = [self.myview personToPoint:person];
            [points addObject:[NSValue valueWithCGPoint:point]];
        }
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            usePoint(points); // take a long time to run
        });    
    });
}

请注意,您的代码中有一个错误,因为您不能将CGPoint' 添加到 an 中,NSArray因为它们不是对象。您必须将它们包装在一个中NSValue,然后将它们打开usePoint()。我使用了NSValue仅适用于 iOS 的扩展。在 Mac OS X 上,您需要将其替换为[NSValue valueWithPoint:NSPointToCGPoint(point)].

于 2012-08-20T04:40:21.940 回答