使用 JSON 将 iTunes 中的图像解析为 tableviewcontroller

2024-05-05

我正在尝试从中解析数据数据源 http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topsongs/limit=30/json,标题已正确解析并显示,但解析图像时出现问题,出现错误:“致命错误:在展开可选值时意外发现 nil” 这是我的代码:

ViewModel.swift

import Foundation

class ViewModel {

let urlString = "http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topsongs/limit=30/json"

var titles = [String]()

var images = [String]()



func fetchTitles(success:() -> ()) {

    let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())

    let url = NSURL(string: urlString)

    let task = session.dataTaskWithURL(url!) { (data, response, error) -> Void in

        let parser = JSONParser()

        self.titles = parser.titlesFromJSON(data!)

        success()

    }

    task.resume()

}

func fetchImages(success:() -> ()) {
    let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())

    let url = NSURL(string: urlString)

    let task = session.dataTaskWithURL(url!) { (data, response, error) -> Void in

        let parser = JSONParser()
        self.images = parser.imagesFromJSON(data!)
        success()
    }
    task.resume()
}

func numberOfSections() -> Int {
    return 1
} 

func numberOfItemsInSection(section: Int) -> Int {
    return titles.count
}

func titleForItemAtIndexPath(indexPath: NSIndexPath) -> String {
    return titles[indexPath.row]
}  

}

和 MyTableViewController.swift

import UIKit

class MyTableViewController: UITableViewController {

let viewModel = ViewModel()

var imageCache = [String:UIImage]()



override func viewDidLoad() {

    super.viewDidLoad()

    self.refresh()

    self.refreshControl = UIRefreshControl()

    self.refreshControl?.addTarget(self, action: #selector(MyTableViewController.refresh), forControlEvents: .ValueChanged)



}



func refresh() {

    viewModel.fetchTitles {

        dispatch_async(dispatch_get_main_queue()) {

            self.tableView.reloadData()

            self.refreshControl?.endRefreshing()

        }

    }

    viewModel.fetchImages {

        dispatch_async(dispatch_get_main_queue()) {

            self.tableView.reloadData()

            self.refreshControl?.endRefreshing()

        }

    }



}



override func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    return self.viewModel.numberOfSections()

}



override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return self.viewModel.numberOfItemsInSection(section)

}



override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! MyTableViewCell

    cell.songTitle.text = self.viewModel.titleForItemAtIndexPath(indexPath)




    let urlString = self.viewModel.titleForItemAtIndexPath(indexPath)

    //found nil 

    let imgURL: NSURL = NSURL(string: urlString)!

    let request: NSURLRequest = NSURLRequest(URL: imgURL)

    NSURLConnection.sendAsynchronousRequest(

        request, queue: NSOperationQueue.mainQueue(),

        completionHandler: {(response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in

            if error == nil {

                cell.songImage.image = UIImage(data: data!)
            }

    })

    return cell

}

和 JSONParser.swift

import Foundation

class JSONParser {



func titlesFromJSON(data: NSData) -> [String] {

    var titles = [String]()



    do {

        if let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String: AnyObject],

            let feed = json["feed"] as? [String: AnyObject],

            entries = feed["entry"] as? [[String: AnyObject]] {



            for entry in entries {

                if let name = entry["im:name"] as? [String: AnyObject],

                    label = name["label"] as? String {

                    titles.append(label)

                }

            }

        }

    } catch {

        print("error parsing JSON: \(error)")

    }



    return titles

}



func imagesFromJSON(data: NSData) -> [String] {

    var images = [String]()



    do {

        if let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String: AnyObject],

            let feed = json["feed"] as? [String: AnyObject],

            entries = feed["entry"] as? [[String: AnyObject]] {



            for entry in entries {

                if let name = entry["im:image"]![0] as? [String: AnyObject],

                    label = name["label"] as? String {

                    images.append(label)

                }

            }

        }

    } catch {

        print("error parsing JSON: \(error)")

    }

    return images
}

}

我有一个 UITableViewCell 的 UiTableViewCell 子类,其中包含 UILabel 和 UIImageView。 我无法弄清楚问题是什么,以及为什么会出现此错误。感谢您的时间。


我始终建议您避免使用强制展开并采用更安全的代码方式(例如使用可选绑定)以避免运行时错误。因此,您可以将代码更改为以下代码并避免运行时错误:

for entry in entries {
    if let name = entry["im:image"], let value = name[0] as? [String: AnyObject],
         label = value["label"] as? String {
             images.append(label)
    }
}

通过上述方式,您可以避免使用强制展开。

我希望这对你有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JSON 将 iTunes 中的图像解析为 tableviewcontroller 的相关文章

随机推荐

  • TestCafe - 浏览器在测试之间总是以干净的状态启动。如何覆盖它以便浏览器记住缓存、用户设置和存储

    测试之间的浏览器始终以干净的状态打开 登录在我的应用程序中被记住 因为身份验证仍然存在 但由于浏览器始终以干净的状态打开 我必须在所有夹具的 Before 挂钩中执行登录 有什么方法可以打开浏览器以便记住用户设置 缓存 本地和会话存储吗 T
  • 从 pandas 数据帧创建 BigQuery 表,无需显式指定架构

    我有一个 pandas 数据框 想从中创建一个 BigQuery 表 我知道有很多帖子询问这个问题 但到目前为止我能找到的所有答案都需要明确指定每列的架构 例如 from google cloud import bigquery as bq
  • Prisma 1 到 2 迁移问题:P4001 内省数据库为空

    因此 我一直在尝试在现有数据库上运行内省过程 如下所示 npx prisma introspect 并收到以下错误跟踪 0 info it worked if it ends with ok 1 verbose cli C Program
  • 无法在 Android MediaRecorder 中设置手动视频大小

    我正在Android中使用MediaRecorder来录制视频 我当前的参数是 mMediaRecorder setAudioSource MediaRecorder AudioSource DEFAULT mMediaRecorder s
  • 在 unnest_wider 之后命名提升向量中的列

    在使用 tidyr 1 0 的一些新功能时 我遇到了一些令人头疼的问题 我用过boxplot stats获取我想用来绘制的箱线图值向量 我已经成功地完成了此操作 但我相信有更好的方法来命名新的未嵌套向量的列 这是当前设置 library t
  • 重复符号_OBJC_CLASS_$_LoginController

    我知道这个问题以前已经被问过很多次了 但到目前为止还没有解决我的问题 我知道当您在项目中获得文件的多个副本时 会发生此错误 我尝试清理构建 删除任何登录控制器 m文件输入编译源然后构建 很好 没有错误 当我在编译源中添加 LoginCont
  • 控制台界面教程和提示 (pdcurses)

    我正在寻找有关使用 PDCurses 库的教程 不幸的是 只有文本文档 这更像是函数参考 pdcurses 是否与 ncurses 足够相似以使用 ncurses 教程 关于制作控制台 UI 的任何提示 附言 PDCurses mingw3
  • Vagrant - Homestead 设置多个站点

    我已经使用 homestead yaml 映射了文件夹等 ip 192 168 10 10 folders map Users User Desktop folder Homestead First to home vagrant Firs
  • 使用EF Core调用存储过程并关闭连接

    我有一个使用 EF Core 的 ASP NET Core 2 2 应用程序 我有一个服务类 通常使用DbContext用于任何 CRUD 操作 然而 在其中一种方法中 Assign下面的方法 我需要使用存储过程 所以我使用以下代码 注意D
  • 在重复键上仅更新 Null 或空值

    我有一个 mysql 查询来合并主键 IMO 上的两个表 查询工作正常 但我遇到的问题是在重复键更新时 我只想更新 wp second 表的那些没有值的字段 简而言之 在重复键上 wp second 值仅应在 null 或空时更新 这是我到
  • polyfit numpy 的反向输出

    我使用了 numpy 的 polyfit 并获得了两个数组 x 和 y 的非常好的拟合 使用七阶多项式 我的关系是这样的 y x p 0 x 7 p 1 x 6 p 2 x 5 p 3 x 4 p 4 x 3 p 5 x 2 p 6 x 1
  • UCM 中的复合基线是什么以及何时使用它?

    UCM 中的综合基线是什么 什么时候会用到 主要是当我们有多个组件的时候才会使用它吗 关于 复合基线 的参考文献是 在 UCM 中使用复合基线的最佳实践 http www ibm com developerworks rational li
  • 在 pandas dataframe python 列中搜索单词

    我有两个文本列 我想查找一列中的单词是否存在于另一列中 我编写了下面的代码 它运行得很好 但它会检测字符串中的任何位置是否存在单词 例如 它将在 ham 中查找 ha 我想改用正则表达式 但我被困住了 我遇到了这个post https st
  • bash 用变量值替换字符串中的变量名

    这有点奇怪 我有以下字符串 我有一个名为 REDIRECT 的变量设置为 https working MYDOMAIN blah blah 我需要将 MYDOMAIN 替换为分配给 MYDOMAIN 的变量的实际值 不确定 bash 还是
  • Java机器学习库可以商用吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道我可以将其用于商业产品的优秀 Java 机器学习库吗 不幸的是 Weka 和 Rapidmin
  • 验证远程图像实际上是 ruby​​ 中的图像文件?

    我试图弄清楚如何验证我输入载波的内容实际上是图像 我获取图像网址的来源并没有返回所有实时网址 有些图像已不复存在 不幸的是 它并没有真正返回正确的状态代码或任何内容 因为我正在使用一些代码来检查远程文件是否存在并且它通过了该检查 因此 现在
  • 使用 Apache Batik 将 SVG 图像转换为 JPEG 图像

    我正在尝试将 SVG 图像转换为 JPEG 如下所示https xmlgraphics apache org batik using transcoder html createImage https xmlgraphics apache
  • res.redirect 不会重定向 Node/Express.js

    我正在为我的 web 应用程序使用 Express 并检查会话中是否存在某些值 将用户重定向到 Instagram 登录页面 但在控制台中我不断收到 302 代码 并且浏览器不会重定向用户 这是我的代码 我正在使用 Ajax 发送我的请求
  • 如何将子记录添加到现有父记录中?

    我一直在 Google 和 Stack Overflow 上搜索有关这个主题的某种提示 但信息充其量是分散的 我正在尝试创建一个新的子记录 Comment 并将其保存到现有的父记录 Post 我使用的是 Ember Model 而不是 Em
  • 使用 JSON 将 iTunes 中的图像解析为 tableviewcontroller

    我正在尝试从中解析数据数据源 http ax itunes apple com WebObjects MZStoreServices woa ws RSS topsongs limit 30 json 标题已正确解析并显示 但解析图像时出现