2014-06-15 3 views
0

NSObject에서 상속 한 Data 클래스가 있습니다.
이 클래스에서는 데이터 요청을 처리합니다.
이 후 NSMutableArray에서 보유하고있는 데이터를 UITableViewController에 보내고 싶습니다.내 클래스에서 TableViewController로 데이터를 보낸 후 NSArray가 비어 있습니다.

어떻게 해결할 수 있습니까?

@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

loadData 메소드가 응답 객체의 내용을 절대로 포함하지 않을 데이터 속성을 반환하고 있습니다. 이것은 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를 사용하지 않는 것은 그것이는 항상에만 보인다 하나의 요소를 포함합니다.

+0

초보자 (당신이 hahah를 볼 수 있듯이)는 나를 위해서 조금 이상합니다. – Navid

+0

문제 없습니다. 유지 사이클이 발생하지 않도록 weak 셀을 추가했습니다. – gavdotnet

+0

TableViewController의 ViewDidLoad에서 [self loadDataWithCompletionBlock] 메서드를 호출하므로 ClubsTableViewController refrence를 보유 할 필요가 없습니다. 사실 제가 한 가지 질문이있었습니다. 올바른 방법입니까? 왜냐하면 저는 항상 컨트롤러와 뷰의 데이터 분리를 유지하는 법을 배웠기 때문입니다. 그러나 내가 loadSiteViewController에서 loadDataWithCompletionBlock을 구현할 때 콜백이 필요하지 않지만 올바른 방법일까요? – Navid

0

AFNetworking GET 메서드는 데이터를 비동기 적으로 가져옵니다. loadData 메소드에서는 네트워크 호출 만 시작하고 응답은 네트워크 요청이 완료되면 배열 속성으로 설정됩니다. 그 전에 loadData 메소드가 반환되기 때문에 배열은 여전히 ​​비어 있습니다.

블록을 loadData 메서드에 매개 변수로 전달하고 AFNetworking이 네트워크 요청을 완료하면이 블록을 호출해야합니다.

+0

비동기이 문제의 주요 문제는 것을 알았지 만, 내가 얻지 못하는 것은 성공 콜백 이후입니다. 내 배열에 응답 객체를 추가합니다. 소스의 일부인이 배열 soo를 반환합니다. 늦은? 나는 간단한 소스 솔루션을 원하지 않지만 누군가가 나에게 힌트를 줄 수 있다면 감사 할 것이다. – Navid

+0

@ gavdotnet이 빠름;) – Cornelius

관련 문제