无法在主线程上使用来自NSURLSession的数据

时间:2016-05-15 11:20:19

标签: ios objective-c nsurlsession

我将网络会话代码放在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
},

1 个答案:

答案 0 :(得分:1)

您的配置不会阻止主线程,您不应该尝试。它的作用是在主线程上调用任何委托方法。

基本上你需要接受这个过程是异步的事实,并在数据可用时处理数据 - 即。在完成块中,而不是在您启动任务之后。

所以基本上它已经正常工作,而不是你的想法或想要(编辑)。