2012-02-09 10 views
0

viewWillAppearでサービスを呼び出すためにNSOperationQueueを使用しています(これについてはviewDidLoadに入れてみました)。私はサービスから得た結果に基づいてUITableViewを投入しています。アプリケーションをデバッグすると、テーブルが最初に呼び出され、次にoperationQueueが呼び出されます。このようにしてテーブルは私のために空です。 operationQueueの後に表を挿入する方法は、その仕事を行います。ここでNSoperationQueueが開始される前にUITableViewが再ロードされます

コードです:

viewWillAppear

-(void)viewWillAppear:(BOOL)animated 
{ 
    operationQueue=[[NSOperationQueue alloc] init]; 
    ParseOperation *obj=[[ParseOperation alloc] initWithMembers:ID]; 
    [operationQueue addOperation:obj]; 
    [obj release]; 

} 

答えて

1

「reloadTable」を解析操作に依存する特定の操作として、解析操作定義の直後とキューを開始する直前に追加することができます(安全のためにキューを一時停止として初期化し、操作は)追加されました。

-(void)myReload { [table performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; }


// ... inside your operation code definition 
NSInvocationOperation *reloadOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myReload) object:nil]; 
[reloadOp addDependency:obj] // adding here the parse operation as a dependency 
[operationQueue addOperation:reloadOp]; 

「myReload」動作reloadTable方法はメインスレッドで呼び出されることを保証するためにスタンドアロン方式のように定義される必要があります

このように、リロードコードは解析操作が終了した後にのみ実行されます。これは、より多くの操作を実行する必要があり、それらのすべてを実行してテーブルを再ロードする必要がある場合に便利です。依存関係は、操作が正常に終了したか、または取り消されたという事実を認識していないことに注意してください。

GCDシリアルキューを定義し、2つのブロックを順番に追加することもできます(最初のブロックは解析され、2番目のブロックはテーブルが再読み込みされます)。そのような場合、GCDは2つのブロック(FIFO)の適切な実行順序を保証する。

+0

上記のNSInvocationOperationのコードは、ParseOperation * obj = [ParseOperation alloc] initWithMembers:ID]の後にviewWillAppearに配置されますか? 私はこれを今試したので、うまくいきませんでした。それでもテーブルメソッドが最初に呼び出されており、テーブルに出力できません。同じクラスでmyReload関数も作成しましたが、動作しません。 – Nitish

+0

あなたのテーブルリロードはどんな場合でも自動的に呼び出されます(特にUITableViewControllerを使用している場合)。しかし、最初は空のテーブルを表示するので、それについて心配するべきではありません。しかし、操作が完了した後、新しいリロードを再度呼び出す必要があります。そのような場合は、表が移入されていることを確認する必要があります。 2つの操作を一緒に作成してから(最初にParseOperationを実行してから操作を再ロードする)、キューに追加してからキューを開始する必要があります(キューを作成するときに「中断」として設定することをおすすめします。 NSOperationを使用するのはなぜですか? – viggio24

+0

ありがとう、たくさんの男。実際、私はoperationQueueにNSInvocationOperationを追加していませんでした。それは絶対にうまく動作しています。 – Nitish

1

あなたはNSOperationの完了圏を設定する必要がありますが。テーブルビューでリロードデータを呼び出す必要がある場所。

- (void)setCompletionBlock:(void (^)(void))block 

編集:

operationQueueが終わった後、この

[obj setCompletionBlock:^{ 
           NSLog(@"I have fnish"); 
           [self.tableView reloadData]; 
           } 
    ]; 
+0

どうすればいいですか?私は初めてoperationQueueを使用しています。あなたが私を例にすれば助けになるでしょう。 – Nitish

+0

編集済み...... –

0

コール[tableView reloadData]を追加します。

関連する問題