2016-04-02 10 views
0

私はAFNetworkingライブラリを使用していましたが、問題が発生しました。私はGET関数を使ってリモートPHPファイルからデータを受け取る次のコードを使用しました。__blockを使用してもデータを保持できません

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 
__block NSDictionary *data = nil; 

[manager GET:@"..." parameters:nil success:^(NSURLSessionTask *task, id responseObject) { 
    data = responseObject; 
} failure:^(NSURLSessionTask *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

_objects = [[data allKeysForObject:@"type"]mutableCopy]; 

見ての通り、私は地元のNSDictionaryの変数を作成し、別のスタックオーバーフローのポストはに私に言ったように、ゼロに設定します。角かっこの中では、すべてがうまく見えます。データが入力されます。ただし、括弧の外側には、dataは完全に空です。なぜこれがうまくいかないのでしょうか?前もって感謝します。親切にコメントで述べたようmatiboo

EDIT 、私はAFNetworkingは、他のすべての前に実行するために起こっメインとは別のスレッド上で実行されたことに気づきました。

しかし、これを修正する方法はまだわかりません。これを処理する関数を作るべきですか?

+0

IOでキューについて読む必要があります。ブロック「成功」および「失敗」は、サーバ応答データの後にバックグラウンドキューで実行される。 すぐに[manager ....]コマンドを実行した後に、メインスレッドで外部NSLogが実行されます。 IOのスレッドとキューに関する関連リンクです。私はあなたがAFNetworkingを使用する前にまずそれを読むべきだと思います。 [link](https://www.raywenderlich.com/4295/multithreading-and-grandcentral-dispatch-on-ios-for-beginners-tutorial) –

+0

ああ。 。 そうですか。私はこれを解決できる方法はありますか? –

+0

私はあなたがJsonがサーバーから戻ったときに何をしたいのか分かりません。 Jsonが処理する必要がある場合は、globar変数(myはあなたの_オブジェクトです)で保存し、それを処理する関数を記述します。 –

答えて

1

あなたの_object変数は、成功ブロック内にある必要があります。 リターンブロックはバックグラウンドスレッドで実行されるため、時間がかかりますので、復帰ブロック(成功または失敗)のコマンドの前にコマンドを実行してください。そのため、データはまだゼロです。あなたのdata

0

はリターンブロックはある程度の時間がかかるであろう、バックグラウンドスレッドで実行されますので、_objects = [[data allKeysForObject:@"type"]mutableCopy];は、successブロックの前に実行されますnil原因です。

_objects内にsuccessブロックを初期化する必要があります。次のようにすることができます。

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

[manager GET:@"..." parameters:nil success:^(NSURLSessionTask *task, id responseObject) { 
    _objects = [[responseObject allKeysForObject:@"type"] mutableCopy]; 
} failure:^(NSURLSessionTask *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 
+0

こんにちは。申し訳ありませんが、私は早く返答できませんでした。ブロック内にオブジェクトを割り当てても、ブロック外のデータを保持する問題がまだ残っていました。何か他の理由がありますか? –

+0

自分のコードを変更したものでコードを更新しました。 –

+0

'_objects'変数の値で何かしたいのであれば、それをメソッドの中に入れ、そのメソッドを' _objects = [[responseObject allKeysForObject:@ "type"] mutableCopy]; ' 。こうすることで、 '_objects'を使用することを避けることができます。これがあなたを助けることを願っています。 – Shawon

関連する問題