【问题标题】:iOS json not retrieving data from iTunes apiiOS json 未从 iTunes api 检索数据
【发布时间】:2015-01-05 15:57:43
【问题描述】:

我正在使用以下代码尝试从 iTunes API 获取 trackName。它应该来自此链接,例如: https://itunes.apple.com/search?term=EMINEM&entity=song&limit=3 一直没有返回(标签是空白的,不是因为标签太小)

- (void)pressSearchKey {
    NSInteger numberOfResults = 3;
    NSString *searchString = self.keyboard.textField.text;

    NSString *encodedSearchString = [searchString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSString *finalSearchString = [NSString stringWithFormat:@"https://itunes.apple.com/lookup?term=%@&entity=song&limit=%ld",searchString,numberOfResults];

    NSURL *searchURL = [NSURL URLWithString:finalSearchString];
    dispatch_queue_t iTunesQueryQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(iTunesQueryQueue, ^{
        NSError *error = nil;
        NSData *data = [[NSData alloc] initWithContentsOfURL:searchURL options:NSDataReadingUncached error:&error];

        if (data && !error) {
            NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

            NSArray *array = [JSON objectForKey:@"results"];
            NSArray *arrayTracks;
            for (NSDictionary *bpDictionary in array) {
                arrayTracks = [bpDictionary objectForKey:@"trackName"];
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                self.keyboard.firstLabel.text = [arrayTracks objectAtIndex:1];
            });
        }
    });
}

【问题讨论】:

  • 当您记录名为JSON 的字典时,它会输出什么?
  • @rebello95 我无法登录,因为这是一个扩展(自定义键盘),但我可以为其设置标签文本。当我做self.keyboard.firstLabel.text = [JSON objectForKey:@"results"]; 时,它甚至没有改变文字。而这个self.keyboard.firstLabel.text = [NSString stringWithFormat:@"%@", JSON]; 只是将标签设为空白
  • 尝试在该行上方放置一个断点并检查元素以查看其内容。我假设反序列化失败
  • @rebello95 我无法设置断点,因为这是自定义键盘。
  • @rebello95 你能做一个简单的应用程序(带有标签和按钮),当你按下按钮时上面的代码运行,看看你是否可以复制它?

标签: ios objective-c json api itunes


【解决方案1】:

你也遇到了一些问题。

  1. 在构建 finalSearchString 时,您永远不会使用您的 encodedSearchString
  2. 您的示例 URL 调用 https://itunes.apple.com/search,而您代码中的 URL 是 https://itunes.apple.com/lookup。将其更改为 search 会返回预期结果。

固定:

NSInteger numberOfResults = 3;
NSString *searchString = @"EMINEM";

NSString *encodedSearchString = [searchString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *finalSearchString = [NSString stringWithFormat:@"https://itunes.apple.com/search?term=%@&entity=song&limit=%ld",encodedSearchString,numberOfResults];

NSURL *searchURL = [NSURL URLWithString:finalSearchString];
dispatch_queue_t iTunesQueryQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(iTunesQueryQueue, ^{
    NSError *error = nil;
    NSData *data = [[NSData alloc] initWithContentsOfURL:searchURL options:NSDataReadingUncached error:&error];

    if (data && !error) {
        NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

        NSArray *array = [JSON objectForKey:@"results"];
        NSArray *arrayTracks;
        for (NSDictionary *bpDictionary in array) {
            arrayTracks = [bpDictionary objectForKey:@"trackName"];
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"%@", [arrayTracks objectAtIndex:1]);
        });
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2023-04-08
    • 2018-04-27
    • 2020-03-12
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多