Ios 如何从NSURLSessionDataTask获取NSDictionary
因此,我尝试将获取的数据作为全局变量,以便在.m文件周围访问它,并使其他.m文件可以访问它,但当我尝试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
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单元格。