Ios 将数据从类发送到TableViewController后,NSArray为空
我有一个从NSObject继承的数据类。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
在这个类中,我处理我的数据请求。
在此之后,我想将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),您可能需要创建一些类来帮助管理数据。