Ios 将数据从类发送到TableViewController后,NSArray为空

Ios 将数据从类发送到TableViewController后,NSArray为空,ios,uitableview,nsmutablearray,nsurl,nsurlrequest,Ios,Uitableview,Nsmutablearray,Nsurl,Nsurlrequest,我有一个从NSObject继承的数据类。 在这个类中,我处理我的数据请求。 在此之后,我想将NSMutableArray中保存的数据发送到我的UITableViewController 我怎样才能解决这个问题 @interface Data : NSObject @property(nonatomic,strong) NSMutableArray *data; -(NSMutableArray *) loadData; -(id)init; @end @implementation

我有一个从NSObject继承的数据类。
在这个类中,我处理我的数据请求。
在此之后,我想将NSMutableArray中保存的数据发送到我的UITableViewController

我怎样才能解决这个问题

@interface Data : NSObject

@property(nonatomic,strong) NSMutableArray *data;

-(NSMutableArray *) loadData;

-(id)init;

@end


@implementation Data

@synthesize data;

-(id)init {

    self = [super init];

    if(self){
        self.data = [[NSMutableArray alloc]init];
    }

    return self;

}

- (NSMutableArray *)loadData {


    NSString *url = @"http://localhost/xampp/flashbackapi/";

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {


        [data addObject:responseObject];


    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error %@",error);
    }];

    return data;

}

@end


#import <UIKit/UIKit.h>
#import "Club.h"
#import "Data.h"

@interface ClubsTableViewController : UITableViewController

@property(nonatomic,strong) Data *holderData;
@property(nonatomic,strong) NSMutableArray *teams;



@end

#import "AFNetworking.h"

@implementation ClubsTableViewController


    - (void)viewDidLoad
    {
        [super viewDidLoad];

        self.holderData = [[Data alloc]init];
        self.teams = [[NSMutableArray alloc]init];

        self.teams = self.holderData.loadData;

        NSLog(@"%@",self.teams); //this array is empty.. why? 



    }
@接口数据:NSObject
@属性(非原子,强)NSMutableArray*数据;
-(NSMutableArray*)加载数据;
-(id)init;
@结束
@实施数据
@综合数据;
-(id)init{
self=[super init];
如果(自我){
self.data=[[NSMutableArray alloc]init];
}
回归自我;
}
-(NSMutableArray*)加载数据{
NSString*url=@”http://localhost/xampp/flashbackapi/";
AFHTTPRequestOperationManager*manager=[AFHTTPRequestOperationManager];
[管理器获取:url参数:无成功:^(AFHTTPRequestOperation*操作,id响应对象){
[数据添加对象:响应对象];
}失败:^(AFHTTPRequestOperation*操作,NSError*错误){
NSLog(@“错误%@”,错误);
}];
返回数据;
}
@结束
#进口
#导入“Club.h”
#导入“Data.h”
@接口ClubTableViewController:UITableViewController
@属性(非原子,强)数据*holderData;
@属性(非原子,强)NSMutableArray*团队;
@结束
#导入“AFNetworking.h”
@实现ClubTableViewController
-(无效)viewDidLoad
{
[超级视图下载];
self.holderData=[[Data alloc]init];
self.teams=[[NSMutableArray alloc]init];
self.teams=self.holderData.loadData;
NSLog(@“%@”,self.teams);//此数组为空。为什么?
}

loadData方法返回的数据属性永远不会包含responseObject的内容。这是因为loadData方法包含一个异步调用(to manager GET:parameters:success:)。当异步调用返回时,将填充数据属性/ivar,在您的情况下,这已经太晚了。一个解决方案是使loadData也成为一个异步方法

比如说:

- (void)loadDataWithCompletionBlock:(void (^)(NSMutableArray *data))completionBlock {

    NSString *url = @"http://localhost/xampp/flashbackapi/";

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {


        [data addObject:responseObject];
        completionBlock(data);


    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error %@",error);
        // TODO: Return completionBlock with empty array (or error?)
    }];
};
这样调用:

ClubsTableViewController __weak *weakSelf = self; 
[self loadDataWithCompletionBlock:^(NSMutableArray *data) {
    weakSelf.teams = data;
}];

此外,您似乎没有将NSMutableArray用作数组,因为它似乎总是只包含一个元素。

AFNetworking GET方法异步获取数据。在loadData方法中,仅启动网络调用,当网络请求完成时,响应设置为array属性。loadData方法在此之前返回,因此数组仍然为空


您应该将一个块作为参数传递给loadData方法,并在完成网络请求后调用此块。

我知道异步是此问题的主要问题,但我没有得到的是在成功回调后,我将响应对象添加到我的数组中并返回此数组。我在源的哪个部分迟到了?我不想要一个简单的源代码解决方案,但如果有人能给我一个提示,我将不胜感激。@gavdotnet更快;)非常感谢你,我是一个初学者(你可以看到哈哈),所以事情对我来说有点奇怪。没问题。刚才添加了weakSelf以确保不发生保留循环。我在TableViewController的ViewDidLoad中调用了[self-loadDataWithCompletionBlock]方法,因此我想我不需要保留ClubTableViewController引用。实际上我还有一个问题,这是正确的方法吗?因为我总是学会将控制器和视图的数据分开保存。但是,当我在ClubsTableViewController中实现loadDataWithCompletionBlock时,我不需要回调,但这是正确的方法吗?只是一个旁注:在调用前始终检查是否设置了一个块:if(completionBlock){completionBlock(data);}@Navid这类问题的答案总是“视情况而定”。但是,如果您只想从云中检索一些简单的数据,将其存储在数组/字典中并显示给用户,那么我就不需要单独的类(即模型层)。对于更复杂的数据管理(例如检索、存储和显示嵌套的JSON),您可能需要创建一些类来帮助管理数据。