从我的类向TableViewController发送数据后,NSArray为空

时间:2014-06-15 21:00:27

标签: ios uitableview nsmutablearray nsurl nsurlrequest

我有一个继承自NSObject的Data类 在这个课程中我处理我的数据请求 在此之后,我想将它在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? 



    }

2 个答案:

答案 0 :(得分:0)

您的loadData方法返回一个永远不会包含responseObject内容的数据属性。这是因为你的loadData方法包含一个异步调用(对于经理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用作数组,因为它似乎总是只包含一个元素。

答案 1 :(得分:0)

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

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