1

新しいビューをロードしている間、テーブルセルにアクティビティインジケーターを表示させるために約1日努力してきました。didSelectRowAtIndexPathで、次の実行中にインジケーターを表示したい

[self.navigationController pushViewController:subKeywordController animated:YES];

次に、このコントローラーはかなり集中的なSQLクエリを実行します

私はウェブを検索して何十もの投稿を読みましたが、私の特定の問題に役立つものはないようです。プッシュと後続のロードが優先されるため、別のスレッドでインジケーターを実行する必要があることは理解していますが、その方法がわかりません。以前、コントローラーでSQLクエリを実行することを考えましたが、それは非常に面倒になっています。

奇妙なことに、私はMBProgressHUDを使用して、この同じテーブルビューにビジーカーソルを問題なく表示しています。検索を適用してから、このエラーの原因となる結果の1つを選択した場合のみです。

bool _WebTryThreadLock(bool)、0x1d79b0:メインスレッドまたはWebスレッド以外のスレッドからWebロックを取得しようとしました。これは、セカンダリスレッドからUIKitを呼び出した結果である可能性があります。今クラッシュしています...

アプリはiPhoneで続行されますが、シミュレーターがクラッシュします。

どんな助けでも大歓迎です。

4

1 に答える 1

2

問題は、コントローラーでのタスクがUIコードを保持していることです(ただし、おそらくすでにそれを知っています!)。これを解決するための安価で簡単な方法は、タイマーを使用して遅いタスク(この場合はSQLクエリ)の開始を少し遅らせることです。

- (void)viewDidLoad {
    [super viewDidLoad];

    // instead of running the SQL here, run it in a little bit
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(doSQL:) userInfo:nil repeats:NO];

    // Show the please wait stuff
    [activityIndicator setHidden:NO];
}

- (void)doSQL:(NSTimer *)timer {
    // Do your sql here
}

これを解決するもう1つの方法は、SQLを別のスレッドに移動することです。

- (void)viewDidLoad {
    [super viewDidLoad];

    // instead of running the SQL here, run it in a little bit
    [self performSelectorInBackground:@selector(doSQL) withObject:nil];

    // Show the please wait stuff
    [activityIndicator setHidden:NO];
}

- (void)doSQL {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Do your sql here

    // Tell the main thread
    [self performSelectorOnMainThread:@selector(doneSQL) userInfo:nil waitUntilDone:YES];

    // Cleanup
    [pool release];
}

- (void)doneSQL {
    // Update your UI here
}

お役に立てば幸いです。

于 2010-08-19T12:51:13.063 に答える