为什么waitUntilAllOperationsAreFinished不会在这段代码中等待?

时间:2013-03-12 11:51:48

标签: objective-c xcode

-(NSInteger) buttonIndexWithMessage:(NSString *) title andArrayOfOptions:(NSArray *) options
{
    self.operation=[NSOperationQueue new];

    [self.operation addOperationWithBlock:^{
        [[NSOperationQueue mainQueue]addOperationWithBlock:^{
            UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:title
                                                                     delegate:self
                                                            cancelButtonTitle:nil
                                                       destructiveButtonTitle:nil
                                                            otherButtonTitles:nil];

            for (NSString * strOption in options) {
                [actionSheet addButtonWithTitle:strOption];
            }

            [actionSheet showInView:[BGMDApplicationsPointers window]];
        }];
        self.operation.suspended=true; //Okay make t
    }];

    [self.operation waitUntilAllOperationsAreFinished];//Don't get out of the function till user act.

    //Wait till delegate is called.
    return self.buttonIndex;//I want to return buttonIndex here.
}

即使self.operation尚未完成,执行点仍会继续移动直到返回self.buttonIndex。

3 个答案:

答案 0 :(得分:1)

你怎么知道自我操作尚未完成?您添加到它的操作执行速度非常快:它只是向主队列添加了另一个操作。

你似乎认为该行

self.operation.suspended=true;

应阻止正在进行的操作。但是来自documentation

  

此方法暂停或恢复操作的执行。   挂起队列会阻止该队列启动其他队列   操作。换句话说,队列中的操作(或添加   被阻止的,以及尚未执行的队列   开始直到队列恢复。暂停队列不会停止   已经在运行的操作。

您的操作已在运行,因此不受影响。

为什么不告诉我们你实际想要实现的目标,我们可以提出如何实现这一目标的好方法。

答案 1 :(得分:0)

第一个问题是你在这里暂停每个添加的操作:

self.operation.suspended=true; 

所以他们没有被执行。

另一个问题是无法保证该块将立即执行,因为您只是将其添加到主操作队列中。将其添加到主操作队列后,您将不知道何时将其安排。我会这样改变代码:

[self.operation addOperationWithBlock:^{
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:title
                                                                 delegate:self
                                                        cancelButtonTitle:nil
                                                   destructiveButtonTitle:nil
                                                        otherButtonTitles:nil];
    for (NSString * strOption in options) {
        [actionSheet addButtonWithTitle:strOption];
    }
    [actionSheet showInView:[BGMDApplicationsPointers window]];
}];

答案 2 :(得分:0)

操作已完成!您正在等待快速完成的操作:所有操作都是向mainQueue添加操作。 mainQueue中发生的事情可能需要一段时间才能完成,但这不是您正在等待的操作。