NSURLSessionDataTask表现得非常慢

时间:2014-01-22 11:54:56

标签: objective-c json parsing nsurlsession

我从网上获取JSON数据,解析它,然后使用它来在地图上显示引脚。

这是方法一,没有问题:

NSString *CLIENT_ID = @"SECRET_ID";
    NSString *CLIENT_SECRET = @"CLIENT_SECRET";

    NSString *SEARCH = [NSString stringWithFormat:@"https://api.foursquare.com/v2/venues/search?near=gjovik&query=cafe&client_id=%@&client_secret=%@&v=20140119", CLIENT_ID, CLIENT_SECRET];

    NSURL *searchResults = [NSURL URLWithString:SEARCH];
    NSData *jsonData = [NSData dataWithContentsOfURL:searchResults];

    NSError *error = nil;
    NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];

    self.venues = dataDictionary[@"response"][@"venues"];

    [self loadAnnotationsAndCenter:YES];

[self loadAnnotationsAndCenter:YES];从JSON文件中检索lat和lng,并使用它来显示地图上的图钉。

我决定用NSURLSession改变我的代码。这是它的样子:

NSString *CLIENT_ID = @"SECRET_ID";
NSString *CLIENT_SECRET = @"CLIENT_SECRET";

NSString *SEARCH = [NSString stringWithFormat:@"https://api.foursquare.com/v2/venues/search?near=gjovik&query=cafe&client_id=%@&client_secret=%@&v=20140119", CLIENT_ID, CLIENT_SECRET];

NSURL *URL = [NSURL URLWithString:SEARCH];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config];

    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        self.venues = dataDictionary[@"response"][@"venues"];
        [self loadAnnotationsAndCenter:YES];
    }];

    [task resume]

NSURLSession比第一种方法慢10到30秒。我不明白为什么会这样。在这种情况下,搜索字符串返回27个不同的位置,如果重要的话

干杯。

2 个答案:

答案 0 :(得分:10)

您需要确保在主线程上执行UIKit方法。

完成处理程序的块将在“委托队列”上执行(参见NSURLSession的{​​{3}}属性)。

您可以通过两种方式完成此任务:设置作为主队列的委托队列([NSOperationQueue mainQueue])或使用

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self loadAnnotationsAndCenter:YES]; 
});

在你的完成区。

答案 1 :(得分:0)

在斯威夫特:

dispatch_async(dispatch_get_main_queue()) {
}