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

最初の問題は、ここで追加されたすべての操作を一時停止することです。

self.operation.suspended=true; 

したがって、それらは実行されません。

もう1つの問題は、ブロックをメイン操作キューに追加するだけなので、ブロックがすぐに実行されることが保証されていないことです。メイン操作キューに追加すると、いつスケジュールされるかわかりません。私はこのようにコードを変更します:

[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 に答える
0

操作終了しました!すぐに終了する操作を待っています。その操作は、mainQueueに操作を追加するだけです。mainQueueで発生することは、完了するまでに時間がかかる場合がありますが、それはあなたが待っている操作ではありません。

于 2013-03-12T13:06:27.007 に答える