Ios 如何从NSURLSessionDataTask获取NSDictionary

Ios 如何从NSURLSessionDataTask获取NSDictionary,ios,objective-c,nsurlrequest,nsurlsessiondatatask,Ios,Objective C,Nsurlrequest,Nsurlsessiondatatask,因此,我尝试将获取的数据作为全局变量,以便在.m文件周围访问它,并使其他.m文件可以访问它,但当我尝试NSLog从其他.m文件获取的数据时,它会输出(null)。我是否可以通过需要数据的其他.m文件访问数据?如果在块内修改NSDictionary,则需要为属性声明\u块属性,如下所示 -(NSDictionary *)fetchFromUrl:(NSString *)url{ NSURLRequest *request = [NSURLRequest requestWithURL:[N

因此,我尝试将获取的数据作为全局变量,以便在.m文件周围访问它,并使其他.m文件可以访问它,但当我尝试
NSLog
从其他.m文件获取的数据时,它会输出(null)。我是否可以通过需要数据的其他.m文件访问数据?

如果在块内修改
NSDictionary
,则需要为属性声明
\u块
属性,如下所示

-(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;
}

如果需要,可以使用_块变量共享存储 在块内更改捕获变量的值,可以 对原始变量使用_块存储类型修饰符 宣言。这意味着变量存在于 在原始变量的词法范围和任何 在该范围内声明的块


您需要在方法中使用block,而不是返回
NSDictionary
,因此请像这样更改代码

首先,像这样改变你的方法

@property (nonatomic, strong) __block NSDictionary *dataFetched;
-(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];          
}
现在像这样调用您的方法

@property (nonatomic, strong) __block NSDictionary *dataFetched;
-(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];          
}

成功了!但是,这个(空(^)(NS字典)数据)字典是如何工作的?你正在做一个API调用,它在后台工作(AsiNC),而你用Reale<代码> NSCORCHON/<代码>声明的函数是同步工作的,这就是为什么当你得到响应之前,它将返回空白字典,其中as块以异步方式工作。好的,它工作了,但是我将如何访问数据值?我尝试使用_块,但它仍然无法获取值。删除该_块,没有必要这样做,该数据就是您想要的字典。是的,您是对的,但我需要该数据在整个.m文件中可用,因为我需要它来填充UITableViewController单元格。