NSURLConnection sendAsynchronousRequest

时间:2014-03-18 18:29:55

标签: objective-c json ios7.1

如果TableView第一次启动,他应该通过JSON检索数据。不幸的是,这不起作用。只有当我使用刷新时,才会加载数据。有人可以帮我找到问题。谢谢你的帮助。

- (void)viewDidLoad
{
[super viewDidLoad];

UINib *nib = [UINib nibWithNibName:@"ErgebnissCell" bundle: nil];
[self.tableView registerNib:nib forCellReuseIdentifier:@"eCell"];


UIRefreshControl *theControl = self.refreshControl;

if([theControl actionsForTarget:self forControlEvent:UIControlEventValueChanged] == nil) {
    [theControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
}
self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Aktuallisiere"];

switch ([self checkInternetConnection]) {
    case NotReachable:
        NSLog(@"Keine Internetverbindung Vorhanden");
        break;
    case ReachableViaWiFi:
        NSLog(@"WI-FI Verbindung Vorhanden");
        break;
    case ReachableViaWWAN:
        NSLog(@"WWAN Verbindung vorhanden");
        break;

    default:
        break;

       }

[self updateItems];

}

-(void)stopRefresh
{
[self.refreshControl endRefreshing]; 
}



- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];

}

-(NetworkStatus)checkInternetConnection
{
self.reachability = [Reachability reachabilityForInternetConnection];
return [self.reachability currentReachabilityStatus];
}

-(NetworkStatus)checkInternetConnectionWithHostName:(NSString*)hostName
{
self.reachability = [Reachability reachabilityWithHostName:(NSString *)hostName];
return [self.reachability currentReachabilityStatus];
}

- (void)viewWillAppear:(BOOL)inAnimated {
[super viewWillAppear:inAnimated];
[self updateItems];
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)inInterfaceOrientation {
return YES;
}

-(IBAction)refresh:(id)sender
{
[self updateItems];
}


- (void)updateItems {

NSString *ergbnisseURL = @"http://iosentwicklung.de/Ergebnisse_2014.json";
NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:ergbnisseURL]];
[NSURLConnection sendAsynchronousRequest: theRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *allCoursesData, NSError *error) {
    if (allCoursesData == nil) {
        NSLog(@"error = %@", error);
    }
    else {
        NSError *error;
        self.alleErgebnisse = [NSJSONSerialization
                               JSONObjectWithData:allCoursesData
                               options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves
                               error:&error];

        self.heim1 = self.alleErgebnisse[@"Heim1"];
        self.gast1 = self.alleErgebnisse[@"Gast1"];
        self.ergebniss1 = self.alleErgebnisse[@"Ergebniss1"];
        self.heim2 = self.alleErgebnisse[@"Heim2"];
        self.gast2 = self.alleErgebnisse[@"Gast2"];
        self.ergebniss2 = self.alleErgebnisse[@"Ergebniss2"];
        self.heim3 = self.alleErgebnisse[@"Heim3"];
        self.gast3 = self.alleErgebnisse[@"Gast3"];
        self.ergebniss3 = self.alleErgebnisse[@"Ergebniss3"];
        self.heim4 = self.alleErgebnisse[@"Heim4"];
        self.gast4 = self.alleErgebnisse[@"Gast4"];
        self.ergebniss4 = self.alleErgebnisse[@"Ergebniss4"];
        self.heim5 = self.alleErgebnisse[@"Heim5"];
        self.gast5 = self.alleErgebnisse[@"Gast5"];
        self.ergebniss5 = self.alleErgebnisse[@"Ergebniss5"];
        self.heim6 = self.alleErgebnisse[@"Heim6"];
        self.gast6 = self.alleErgebnisse[@"Gast6"];
        self.ergebniss6 = self.alleErgebnisse[@"Ergebniss6"];
        self.heim7 = self.alleErgebnisse[@"Heim7"];
        self.gast7 = self.alleErgebnisse[@"Gast7"];
        self.ergebniss7 = self.alleErgebnisse[@"Ergebniss7"];
        self.heim8 = self.alleErgebnisse[@"Heim8"];
        self.gast8 = self.alleErgebnisse[@"Gast8"];
        self.ergebniss8 = self.alleErgebnisse[@"Ergebniss8"];
        self.heim9 = self.alleErgebnisse[@"Heim9"];
        self.gast9 = self.alleErgebnisse[@"Gast9"];
        self.ergebniss9 = self.alleErgebnisse[@"Ergebniss9"];
        self.heim10 = self.alleErgebnisse[@"Heim10"];
        self.gast10 = self.alleErgebnisse[@"Gast10"];
        self.ergebniss10 = self.alleErgebnisse[@"Ergebniss10"];
        self.heim11 = self.alleErgebnisse[@"Heim11"];
        self.gast11 = self.alleErgebnisse[@"Gast11"];
        self.ergebniss11 = self.alleErgebnisse[@"Ergebniss11"];
        self.heim12 = self.alleErgebnisse[@"Heim12"];
        self.gast12 = self.alleErgebnisse[@"Gast12"];
        self.ergebniss12 = self.alleErgebnisse[@"Ergebniss12"];
        self.heim13 = self.alleErgebnisse[@"Heim13"];
        self.gast13 = self.alleErgebnisse[@"Gast13"];
        self.ergebniss13 = self.alleErgebnisse[@"Ergebniss13"];
        self.heim14 = self.alleErgebnisse[@"Heim14"];
        self.gast14 = self.alleErgebnisse[@"Gast14"];
        self.ergebniss14 = self.alleErgebnisse[@"Ergebniss14"];
        self.heim15 = self.alleErgebnisse[@"Heim15"];
        self.gast15 = self.alleErgebnisse[@"Gast15"];
        self.ergebniss15 = self.alleErgebnisse[@"Ergebniss15"];
        self.heim16 = self.alleErgebnisse[@"Heim16"];
        self.gast16 = self.alleErgebnisse[@"Gast16"];
        self.ergebniss16 = self.alleErgebnisse[@"Ergebniss16"];
        self.heim17 = self.alleErgebnisse[@"Heim17"];
        self.gast17 = self.alleErgebnisse[@"Gast17"];
        self.ergebniss17 = self.alleErgebnisse[@"Ergebniss17"];
        self.heim18 = self.alleErgebnisse[@"Heim18"];
        self.gast18 = self.alleErgebnisse[@"Gast18"];
        self.ergebniss18 = self.alleErgebnisse[@"Ergebniss18"];
        self.heim19 = self.alleErgebnisse[@"Heim19"];
        self.gast19 = self.alleErgebnisse[@"Gast19"];
        self.ergebniss19 = self.alleErgebnisse[@"Ergebniss19"];
        self.heim20 = self.alleErgebnisse[@"Heim20"];
        self.gast20 = self.alleErgebnisse[@"Gast20"];
        self.ergebniss20 = self.alleErgebnisse[@"Ergebniss20"];
        self.heim21 = self.alleErgebnisse[@"Heim21"];
        self.gast21 = self.alleErgebnisse[@"Gast21"];
        self.ergebniss21 = self.alleErgebnisse[@"Ergebniss21"];
        self.heim22 = self.alleErgebnisse[@"Heim22"];
        self.gast22 = self.alleErgebnisse[@"Gast22"];
        self.ergebniss22 = self.alleErgebnisse[@"Ergebniss22"];
        self.heim23 = self.alleErgebnisse[@"Heim23"];
        self.gast23 = self.alleErgebnisse[@"Gast23"];
        self.ergebniss23 = self.alleErgebnisse[@"Ergebniss23"];
        self.heim24 = self.alleErgebnisse[@"Heim24"];
        self.gast24 = self.alleErgebnisse[@"Gast24"];
        self.ergebniss24 = self.alleErgebnisse[@"Ergebniss24"];
        self.heim25 = self.alleErgebnisse[@"Heim25"];
        self.gast25 = self.alleErgebnisse[@"Gast25"];
        self.ergebniss25 = self.alleErgebnisse[@"Ergebniss25"];

    }
}];
[self.tableView reloadData];
[self.refreshControl setTintColor:[UIColor colorWithRed:0.000 green:0.000 blue:0.630 alpha:1.000]];
//[self setRefreshControl: self.refreshControl];
[self performSelector:@selector(stopRefresh) withObject:nil afterDelay:3];
//[self.refreshControl endRefreshing];


}

2 个答案:

答案 0 :(得分:0)

您不是从异步完成块调用表上的reloadData。您在进行异步调用后立即调用它。试试这个:

// weak reference self:
__weak typeof(self)weakSelf = self;

[NSURLConnection sendAsynchronousRequest: theRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *allCoursesData, NSError *error) {

    __strong typeof(weakSelf)strongSelf = weakSelf;

    if (allCoursesData == nil) {
        NSLog(@"error = %@", error);
    }
    else {
        NSError *error;
        self.alleErgebnisse = [NSJSONSerialization
                           JSONObjectWithData:allCoursesData
                           options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves
                           error:&error];

        // do stuff 

        // RELOAD TABLE HERE:
        [self.tableView reloadData];
    }
}];

答案 1 :(得分:0)

顾名思义sendAsynchronousRequest是异步的。这意味着函数返回并继续执行下一行代码,即使函数本身尚未完成其工作。这也意味着这一行

[self.tableView reloadData];

没有任何效果,因为当您已经执行了reloadData方法时,请求仍然有效,因此没有任何数据需要重新加载,因为请求仍在获取信息。

此外,它第二次工作,但事实上它不起作用。您第二次看到的是上一个请求中的数据。

一种可能的解决方案是将reloadData行放在completionHandler块内,正上方。