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