0

モーダルビューコントローラーが表示され、インターネット上のサービスをチェックし、完了したら自分自身を閉じます。ペン先には、アクティビティインジケータと、何が起こっているかをユーザーに通知するためのラベルが含まれています。

更新が完了すると、ラベルが「更新完了」に変わり、ViewControllerが閉じられます。ただし、テキストが消える前にユーザーがテキストを確認できるように、却下を数秒間遅らせたいと思います。だから私はこれをしました:

#pragma mark - AssetLoaderServiceDelegate

- (void)assetLoaderServiceDidFinishLoading:(AssetLoaderService *)service
{
    [self.spinner stopAnimating];
    self.infoLabel.text = @"Update complete";
    [self performSelector:@selector(dismissUpdater) withObject:nil afterDelay:2.0];
}

- (void)dismissUpdater
{
    [self dismissModalViewControllerAnimated:YES];
}

しかし、何らかの理由で、セレクターが呼び出されることはありません。私もモードで実行してみましたNSRunLoopCommonModesが、それも機能しません。

私は何か間違ったことをしているに違いないが、何がわからない...

編集:デリゲートコールバックは実際には内でNSOperationQueue発生しています。これは、メッセージをView Controllerに送り返すときに、同じスレッド上にないことを意味している可能性がありますか?だから私は試しました

[self performSelector:@selector(downloadQueueComplete) withObject:nil afterDelay:0.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];

に続く

- (void)downloadQueueComplete
{
    [delegate assetLoaderServiceDidFinishLoading:self];
}

しかし、performSelectorはここでも機能していないようです。

4

2 に答える 2

2

スレッドの問題についての提案をフォローアップして、次のことを試してみてください。

[self performSelectorOnMainThread:@selector(downloadQueueComplete) withObject:nil waitUntilDone:YES]];
于 2012-06-29T11:25:24.017 に答える
1

並べ替えました!AssetLoaderServiceでは、メインスレッドでセレクターを実行する必要がありました。

 [self performSelectorOnMainThread:@selector(downloadQueueComplete) withObject:nil waitUntilDone:YES];

その後、以下のすべての呼び出しは正しいスレッドで行われました。:)

于 2012-06-29T11:25:53.387 に答える