我将网络会话代码放在viewDidLoad中。我配置了在主队列中执行的会话。在完成处理程序中,我将收到的数据保存到类属性 在[dataTask resume]操作之后,我想开始处理并分析这个属性,但是从NSlog结果我可以看到,那是空的。 因此我理解它是空的,因为当我尝试打印我的属性时,仍在执行处理网络数据的块,即使我将会话配置为主队列。我应该改变什么才能使其正常工作?
代码:
@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 :(得分:1)
您的配置不会阻止主线程,您不应该尝试。它的作用是在主线程上调用任何委托方法。
基本上你需要接受这个过程是异步的事实,并在数据可用时处理数据 - 即。在完成块中,而不是在您启动任务之后。
所以基本上它已经正常工作,而不是你的想法或想要(编辑)。