如何从NSURLSessionDataTask获取NSDictionary

时间:2016-08-01 04:53:22

标签: ios objective-c nsurlrequest nsurlsessiondatatask

-(NSDictionary *)fetchFromUrl:(NSString *)url{
    NSURLRequest *request = [NSURLRequest  requestWithURL:[NSURL URLWithString:url]];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                        completionHandler:
                              ^(NSData *data, NSURLResponse *response, NSError *error) {
                                  dataFetched = [NSJSONSerialization JSONObjectWithData:data
                                                                                           options:0
                                                                                             error:NULL];

                              }];
    [task resume];
    NSLog(@"dataFetched, %@", dataFetched);

    return dataFetched;
}

所以我尝试将dataFetched作为全局变量,以便我可以在我的.m文件中访问它并使其可以被其他.m文件访问,但是当我尝试NSLog从其他.m文件中获取dataFetched它输出( null )。无论如何,我可以在我需要数据的其他.m文件中访问数据吗?

2 个答案:

答案 0 :(得分:1)

你需要在你的方法中使用block,而不是返回NSDictionary,所以改变你的代码就像这样。

首先像这样改变你的方法

-(void)fetchFromUrl:(NSString *)url withDictionary:(void (^)(NSDictionary* data))dictionary{ 
    NSURLRequest *request = [NSURLRequest  requestWithURL:[NSURL URLWithString:url]];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                            completionHandler:
                                  ^(NSData *data, NSURLResponse *response, NSError *error) {
                                      NSDictionary *dicData = [NSJSONSerialization JSONObjectWithData:data
                                                                                    options:0
                                                                                      error:NULL];
                                      dictionary(dicData);
                                  }];
    [task resume];          
}

现在像这样调用你的方法

[self fetchFromUrl:urlStr withDictionary:^(NSDictionary *data) {
    self.dataFetched = data;
    NSLog(@"data %@",data);
}];

答案 1 :(得分:0)

如果您修改了区块内的NSDictionary,则需要为您的财产声明__block属性,如下所示

@property (nonatomic, strong) __block NSDictionary *dataFetched;

查看doc

  

使用__block变量共享存储如果您需要能够   您可以从块中更改捕获变量的值   在原始变量上使用__block存储类型修饰符   宣言。这意味着变量存在于存储中   在原始变量的词法范围和任何之间共享   在该范围内宣布的块。