2016-05-15 10 views
0

viewDidLoadにネットワークセッションコードを挿入しました。メインキューで実行するようにセッションを構成しました。完了ハンドラでは、受け取ったデータをクラスプロパティに保存します。 [dataTask resume]操作の後で、このプロパティの処理と分析を開始したいのですが、NSlogの結果から空であることがわかります。 メインキューにセッションを設定していても、プロパティを印刷しようとすると、ネットワークデータの処理中のブロックがまだ実行されているため、空であるとわかります。正しく動作させるためにはどうすればよいですか?メインスレッドでNSURLSessionのデータを処理できません

コード:

@interface MainSourceDailyViewController() 
@property (strong, nonatomic) NSArray *allData; 

@end 

@implementation MainSourceDailyViewController 

- (void)viewDidLoad { 
[super viewDidLoad]; 


NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] 
                 delegate:nil 
               delegateQueue:[NSOperationQueue mainQueue]]; 
NSURL *url = [NSURL URLWithString: @"http://xxxxxxxxxx"]; 

NSURLSessionDataTask * dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 

    if ([[NSThread currentThread] isMainThread]){ 
     NSLog(@"In main thread--completion handler"); 
    } 
    else { 
     NSLog(@"Not in main thread--completion handler"); 
    } 
    self.allData = [[NSArray alloc] initWithArray:array]; 
    NSLog(@"Answer in block: %@", self.allData); 


}]; 
[dataTask resume]; 

NSLog(@"Final answer %@", self.allData); 

}

出力:

2016-05-15 01:20:55.359 Final answer (null) 
2016-05-15 01:20:56.500 In main thread--completion handler 
2016-05-15 01:20:56.506 Answer in block: (
    { 
Data contents 
}, 
+0

すぐにself.allData = [[NSArray alloc] initWithArray:array];を取得します。このデータを必要とするすべてのクラスに通知を送信できます。 – Alok

答えて

1

あなたの設定は、メインスレッドをブロックしていない、とあなたがしようとしないはずです。それは、メインスレッド上の任意のデリゲートメソッドを呼び出すことです。

基本的には、プロセスが非同期であり、使用可能になった時点でデータを処理するという事実を受け入れる必要があります。タスクを開始した後ではなく、完了ブロックで。

だから、基本的には既に正しく働いています。あなたが思っていたかどうかは分かりません。

+0

あなたの答えをありがとう!ちょうど少数のことを明確にしたい:1)メインスレッド上の呼び出し代理人だけの場合、なぜ私の完了ハンドラがメインスレッド上で実行されるかを出力で見ることができますか?私はまた、セッション共有構成とdispatch_async(dispatch_get_main_queue()、^ { self.allData = [[NSArray alloc] initWithArray:array]; }})を使用しようとしました。私は同じ結果を得ました。 2)私はすべての処理データを完成ハンドラの中に入れるべきですか? – Denys

+0

完了はデリゲートのようです。そこに置くかそこから別のメソッドを呼び出す(しばしばクリーナー) – Wain

関連する問題