如上图的代码。我使用AFN来进行网络数据请求,我封装这个数据解析的方法。
但是每次执行后,我发现 block里面的数据都是有的,也能打印出来,但是 返回的DataList数组,一直为空,nill。
我想可能是AFN的代码块执行引起的吧是不是因为 程序会先执行return语句,再去执行block。所以导致 赋值永远为空。如果是这种原因,如何解决这个代码执行的顺序问题呢请各位大牛们 不吝赐教,帮帮我这个小菜鸟啊~

解决方案 »

  1.   

    由于AFN发送post请求是在异步执行,所以你的datalist先返回肯定为空
      

  2.   

    那是因为AFN发起的是一个异步请求。在请求未返回数据时,你的函数就返回了_DataList,这时的_DataList肯定是空的。AFN的的结果返回是在它的success Block中。了解的问题的所在,使用block实现也不难,见如下函数定义,增加了一个block的参数。
    -(void)AFNDataSourceFor_GetWorthyBids_MethodWithWith:(NSString *)URL andWith:(NSMutableDictionary *)Params successBlock:(void(^)(NSMutableArray *)dataList ) {
            //////////此处省略,在AFN的回调中
           _DataList = _OriginDataSource[@"sBidList"];
          //////////将DataList回调给订阅者
          successBlock(_DataList); 
    }
      

  3.   

    同问,block异步执行,并且执行后销毁,怎么获取block内部的数据呢?
      

  4.   

    就像三楼 大神说的,AFN的数据仅存在于block内,所以我们也可以使用一个block函数把数据传送出来:
     [[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的函数:
      

  5.   

    接上面 没写完按顺手了。。
    我们创建一个包含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的异步导致的数据返回为空的问题,希望能帮助到你,如果你有更好地方法或建议,欢迎你的分享和补充。