-(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。
答案 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中发生的事情可能需要一段时间才能完成,但这不是您正在等待的操作。