3
-(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。

4

3 回答 3

1

你怎么知道self.operation还没有完成呢?您添加到其中的操作执行起来非常快:它只是将另一个操作添加到主队列中。

你似乎认为那行

self.operation.suspended=true;

应该阻止正在进行的操作。但是从文档中:

此方法暂停或恢复操作的执行。暂停队列可防止该队列启动其他操作。换句话说,队列中(或稍后添加到队列中)且尚未执行的操作将被阻止启动,直到队列恢复。暂停队列不会停止已经在运行的操作。

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

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

于 2013-03-12T13:05:44.393 回答
0

手术结束!您正在等待一个快速完成的操作:该操作所做的只是向 mainQueue 添加一个操作。mainQueue 中发生的事情可能需要一些时间才能完成,但这不是您正在等待的操作。

于 2013-03-12T13:06:27.007 回答
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]];
}];
于 2013-03-12T13:01:11.727 回答