如上图的代码。我使用AFN来进行网络数据请求,我封装这个数据解析的方法。
但是每次执行后,我发现 block里面的数据都是有的,也能打印出来,但是 返回的DataList数组,一直为空,nill。
我想可能是AFN的代码块执行引起的吧是不是因为 程序会先执行return语句,再去执行block。所以导致 赋值永远为空。如果是这种原因,如何解决这个代码执行的顺序问题呢请各位大牛们 不吝赐教,帮帮我这个小菜鸟啊~
但是每次执行后,我发现 block里面的数据都是有的,也能打印出来,但是 返回的DataList数组,一直为空,nill。
我想可能是AFN的代码块执行引起的吧是不是因为 程序会先执行return语句,再去执行block。所以导致 赋值永远为空。如果是这种原因,如何解决这个代码执行的顺序问题呢请各位大牛们 不吝赐教,帮帮我这个小菜鸟啊~
-(void)AFNDataSourceFor_GetWorthyBids_MethodWithWith:(NSString *)URL andWith:(NSMutableDictionary *)Params successBlock:(void(^)(NSMutableArray *)dataList ) {
//////////此处省略,在AFN的回调中
_DataList = _OriginDataSource[@"sBidList"];
//////////将DataList回调给订阅者
successBlock(_DataList);
}
[[AFAPIClient sharedClient] GET:data parameters:nil success:^(NSURLSessionDataTask * __unused task, id JSON) {
if (block) {
ApiResultModel *result = [[ApiResultModel alloc] initWithDict:(NSDictionary*)JSON];
block(result);//我们使用一个block回调把获取到的数据传递出来。
}
} failure:^(NSURLSessionDataTask *__unused task, NSError *error) {
if (block) {
ApiResultModel *error = [[ApiResultModel alloc] initWithInterfaceError];
block(error);
}
}];
前提就是,我们先写一个包含一个block的函数:
我们创建一个包含block的函数:
/*
*void (^)(ApiResultModel*))block 供数据返回
*data 需要提交给接口的数据
/
+ (void)publicTimelineTweetsWithGetBlock:(void (^)(ApiResultModel*))block andPostData:(NSString*)data{执行AFN接口解析,并使用block爸数据传递出来。}这样,我们在调用这个函数以后就可以直接获取数据:
[ApiClient publicTimelineTweetsWithGetBlock:^(ApiResultModel *result) {
if (result) {//我们在需要的地方调用函数,block已经把数据传(result)递出来了
block(result);
}并且相同的 我们还可以再次使用block,这样就可以将所有的接口归到一个控制器下,需要时直接调用对应的接口方法,直接获取对应的数据:
//页面接口
[[ApiInterface getinstance] getNewCustomerMineInfoBlock:^(ApiResultModel *result) {//函数返回result
[self getUserInfoRequestCallback:result];//获取result。
} customerId:[_cust.userid stringValue]];
我就是这样来解决AFN的异步导致的数据返回为空的问题,希望能帮助到你,如果你有更好地方法或建议,欢迎你的分享和补充。