0

呼び出したらすぐにビューを表示したいと思います。ビューを表示する方法がわかりません。

-(IBAction) showProgress: (id) sender {
   progressViewController *progress = [[progressViewController alloc] initWithNibName:@"progressViewController" bundle:NULL];
   [self.view addSubview:progress.view];
   [self someFunctionWhichTakesAgesToBeDone];
}

現在の UIViewController から呼び出されます。ビューは長い関数の後に表示されます。long 関数の前に表示するにはどうすればよいですか? ご回答ありがとうございます。

4

3 に答える 3

1

最も簡単な方法 (Apple が推奨) である GCD (Grand Central Dispatch) を使用すると、コードは次のようになります。

-(IBAction) showProgress: (id) sender {
    progressViewController *progress = [[progressViewController alloc] initWithNibName:@"progressViewController" bundle:NULL];
    [self.view addSubview:progress.view];

    // Heavy work dispatched to a separate thread
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"dispatched");
        // Do heavy or time consuming work
        [self someFunctionWhichTakesAgesToBeDone];

        // When finished call back on the main thread:
        dispatch_async(dispatch_get_main_queue(), ^{
            // Return data and update on the main thread
        });
    });

}

2ブロックです。最初のブロックは別のスレッドで重い作業を行い、重い作業が終了すると 2 番目のブロックが呼び出され、必要に応じてメイン スレッドで変更と UI の更新が行われます。

于 2012-09-23T21:31:50.410 に答える
0

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait`

使用する

[self.view performSelectorOnMainThread:@selector(addSubview:) withObject:progress.view waitUntilDone:YES]

MySleepFuncまたは、Sleep() 関数を別の関数に入れて呼び出します(他の関数であることを願っています。Sleep() 関数は、言われているように本当に悪いです)。

[self performSelector:@selector(MySleepFunc) withObject:nil afterDelay:0.003]

Sleep(3) の代わりに。

于 2012-09-23T20:36:45.853 に答える
0

マルチスレッドについて読んでください。つまり、描画やユーザー イベントの受け入れなどを行う単一の UI スレッドがあります。sleep() またはその他のブロッキング メソッドで一時停止すると、何も表示/再描画されず、イベントは処理されません。バックグラウンド スレッドから HTTP リクエストを行う必要があります。

于 2012-09-23T20:48:46.117 に答える