我有一个继承自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?
}
答案 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完成网络请求后调用此块。