NSURLSessionDataTask表现得异常缓慢

3

我正在从网络上获取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文件中检索纬度和经度,并将其用于在地图上显示标记。

我决定使用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个回答

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

完成处理程序的代码块将在“委托队列”上执行(请参见 NSURLSessiondelegateQueue 属性)。

您可以通过两种方式实现这一点:设置委托队列为主队列 ([NSOperationQueue mainQueue]) 或使用

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

在您的完成块中。


谢谢!这可能是一个愚蠢的问题,但我是IOS的新手。如何知道我的函数是UIKit方法的一部分? - Nilzone-
@Nilzone- 如果您更新UI,即是否是这些类之一:https://developer.apple.com/library/ios/documentation/uikit/reference/UIKit_Framework/_index.html - Rob

0

在Swift中:

dispatch_async(dispatch_get_main_queue()) {
}

一些代码解释可能有助于理解问题以及为什么您的代码可以解决该问题。 - dvhh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接