1
-(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 文件中访问数据吗?

4

2 回答 2

1

您需要在方法中使用块,而不是返回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);
}];
于 2016-08-01T05:09:42.480 回答
0

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

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

文档

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

于 2016-08-01T04:58:27.673 回答