循环中有多个UrlSessionTask

时间:2015-03-10 07:38:49

标签: ios objective-c nsurlsession

我是iOS新手,我工作的项目需要将json解析为本地数据库。

情况是我必须首先遍历多个http请求并生成一个NSDictionary数组。我有一个使用Dictionary插入对象的方法。

for (NSNumber *cd_id in self.deviceIDList) {
    NSURL *getDeviceUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://api.abc.com/v2/devices/%@/?session_key=123",cd_id]];
    NSURLSessionDataTask *deviceTask = [[NSURLSession sharedSession] dataTaskWithURL:getDeviceUrl completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        [self processDeviceData:data];
    }];
    [deviceTask resume];
}

- (void)processDeviceData:(NSData *)data{
    NSError *JSONError = nil;
    NSDictionary *deviceDetail = [NSJSONSerialization JSONObjectWithData:data
                                                                 options:NSJSONReadingAllowFragments
                                                                   error:&JSONError];
    [self.deviceDetailList addObject:deviceDetail];
    if (JSONError) {
        NSLog(@"json data = %@", deviceDetail);
    }
}

processDeviceData方法只是从json创建字典并将它们放入一个数组中。但是,我无法创建 deviceDetailList 数组。

这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

因此,您已拥有属性deviceDetailList,该属性应为NSMutableArray。在这个类的init方法中,您应该创建一个空数组实例:

self.deviceDetailList = [NSMutableArray array];

然后在任务完成块中,您应该使用GCD切换回主线程来更新阵列:

dispatch_async(dispatch_get_main_queue(), ^(void){
    [self processDeviceData:data];

    // probably trigger a UI update here...
});