2014-10-02 5 views
1

JSON을 사용하여 OpenweatherMap에서 데이터를 가져 와서 UITableView에서 인쇄하는 간단한 날씨 응용 프로그램을 만들려고합니다. 그러나 아래 코드를 실행하여 numberOfRowsInSection 메서드에 중단 점을 설정하면 0 행을 반환합니다. 어떻게 든 viewDidLoad 메서드가 numberOfRowsInSection 메서드 뒤에 호출되었으므로 threeHoursForecast 배열이 비어있는 것입니다. 아무도 이걸 좀 도와 줄 수 없어?UITableView 메서드가 ViewDidLoad 전에 호출됩니다.

static NSString * const BaseURLString = @"http://api.openweathermap.org/data/2.5/forecast?q=Houston"; 

@interface HPViewController() 

@end 

@implementation HPViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.threeHoursForecast = [[NSMutableArray alloc] init]; 
    self.tableView.dataSource = self; 
    self.tableView.delegate = self; 

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

    [manager POST:BaseURLString parameters:nil 
      success:^(AFHTTPRequestOperation *operation, id responseObject) { 

       NSArray *data = [responseObject objectForKey:@"list"]; 

       for (NSDictionary *forecastPerThreeHours in data) 
        [self.threeHoursForecast addObject:[[forecastPerThreeHours valueForKey:@"main"] valueForKey:@"temp"]]; 
      } 

      failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

       NSLog(@"Error: %@", error); 
      }]; 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // Return the number of rows in the section. 
    return [self.threeHoursForecast count]; 
} 

답변

8

완료 핸들러가 호출 된 후 데이터를 다시로드 할 수 있으므로 문제가 해결됩니다.

[manager POST:BaseURLString parameters:nil 
      success:^(AFHTTPRequestOperation *operation, id responseObject) { 

       NSArray *data = [responseObject objectForKey:@"list"]; 

       for (NSDictionary *forecastPerThreeHours in data) 
        [self.threeHoursForecast addObject:[[forecastPerThreeHours valueForKey:@"main"] valueForKey:@"temp"]]; 

       //Add this line 
       [self.TableView reloadData]; 
      } 

      failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

       NSLog(@"Error: %@", error); 
      }]; 
+0

고마워요. 이제 작동합니다. 이전에 데이터를 다시로드하려고 시도했지만 요청 성공 블록 외부에 배치 했으므로 작동하지 않았습니다. – Harry

3

post 메서드는 async입니다. succes 요청 블록에 [self.tableView reloadData];을 추가해야합니다.

+0

감사합니다. 이제 작동합니다. 전에 데이터를 다시로드하려고 시도했지만 요청의 성공 블록 외부에 넣었으므로 작동하지 않았습니다. – Harry

1

비동기 호출이므로 JSON을 가져온 후에 데이터를 다시로드해야합니다.

[manager POST:BaseURLString parameters:nil 
       success:^(AFHTTPRequestOperation *operation, id responseObject) { 

        NSArray *data = [responseObject objectForKey:@"list"]; 

        for (NSDictionary *forecastPerThreeHours in data) 
         [self.threeHoursForecast addObject:[[forecastPerThreeHours valueForKey:@"main"] valueForKey:@"temp"]]; 

        // [NOTE] 
        [self.tableView reloadData]; 
       } 

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