2

iPhoneアプリの操作を同期する方法を見つけるのに苦労しています。私は3つの主要なNSOperationを持っています。

    NSInvocationOperation *showSpinner = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(spinnerOn:) object:YES];
    NSInvocationOperation *reloadDatasource = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(reloadDatasource) object:nil];
    NSInvocationOperation *hideSpinner = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(spinnerOn:) object:NO];
    // Add dependency
    [reloadDatasource addDependency:showSpinner];
    [hideSpinner addDependency:reloadDatasource];

    [self.queue addOperation:showSpinner];
    [self.queue addOperation:reloadDatasource];
    [self.queue addOperation:hideSpinner];

3つの操作が順番に正しく開始されていることがわかります。ただし、ご想像のとおり、最初の操作ではUIViewを作成して上部にアタッチし、最後の操作では削除する必要があります。

グラフィカルに言えば、操作は画面上で一度に発生します。そのため、スピナーが画面に表示されているときにテーブルが既に読み込まれていることや、その他の奇妙な同期されていないことがわかります。

グラフィック側の変更はメインスレッドで発生することを理解しました。だから私は、コードを変更して、本来の機能を実行するにはどうすればよいかを尋ねています。スピナーを作成し、データをロードし、スピナーを削除しますか?グラフィック操作とデータ操作を分離する一般的な方法はありますか?たとえば、2つの異なる操作を作成します。

ありがとう

4

3 に答える 3

1

書いてみませんか

[self spinnerOn:YES];
[self performSelectorInBackground:@selector(reloadDatasource) withObject:nil];

次に、「reloadDataSource」メソッドでメインスレッドにコールバックします。

[self performSelectorInMainThread:@selector(spinnerOn:) withObject:NO];
于 2010-10-16T15:56:13.913 に答える
0

NSOperation を使用することは必須ですか? そうでない場合は、単純な問題を解決する難しい方法を選択していると思います.NSConnectionのデリゲート(またはreloadDataSourceが何をするかわからないので同様のもの)を使用して、スピナーを開始および停止します終わり。

于 2010-10-16T14:47:22.393 に答える
0

spinnerOn: メソッドに、操作がメイン スレッドで確実に行われるようにするためのロジックを少し追加してみてください。

if ( ![NSThread isMainThread] ) { 
    [self performSelectorOnMainThread:@selector(spinnerOn:) withObject:anObject waitUntilDone:NO];
    return;
}

それが違いを生むかどうかを知りたいです。私の疑いでは、代替スレッドから UI タスクを呼び出すと、それらがキューに入れられ、後でメイン スレッドで未定義の時間に一度に発生する可能性があります。

試行する別のオプションは、操作キューをシリアルキューにすることです。これは、一度に 1 つのタスクのみを実行することを意味します。次に、追加した順序で常にタスクを実行するだけなので、依存関係を忘れることができます。設定することでそれを試すことができます:

[self.queue setMaxConcurrentOperationCount:1];

これがまったく役立つかどうか教えてください。

于 2010-10-18T15:57:47.127 に答える