心辰·Dev

电影热搜 APP 项目总结

技术要点

“电影热搜”是我个人开发的第一个 iOS 应用。去年冬天,在初步熟悉了 Swift 语法之后,我参考 iOS Apprentice 第四款应用的源码,在此基础上完成了自己的应用。说起来,从零基础到做出一个完整的应用并不需要太多时间的投入。只是一旦入坑,就知道自己所要学习的东西还有太多。这个应用主要是用来熟悉苹果公司推荐的新技术,并没有用第三方的类库。下面是开发这个应用的一些要点:

  1. 使用 MVC 架构;
  2. Storyboard 快速构建界面;
  3. Auto Layout 支持各类型设备的自动布局;
  4. NSURLSession 处理网络请求、下载图片;
  5. NSJSONSerialization 解析 JSON 数据;
  6. 异步网络请求,防止阻塞主线程;
  7. Presentation Controller 实现页面跳转效果;
  8. Core Data 进行用户数据的传递和存储,遵循依赖注入原则;
  9. 对屏幕旋转做界面适配。
  10. 全面采用原生 API ,提高应用运行效率。

备忘

  • 把常量定义放入结构体,便于后续使用。

    1
    2
    struct TableViewCellIdentifiers {
    static let searchResultCell = "SearchResultCell" }
  • 在 TableView Cell 中如果出现加载网络图片的需求,应先用占位图片显示,再异步加载网络图片。实现类似功能,还可以用代理(proxy)设计模式,创建一个缩略图代理类,在后台进行实际图像的懒加载。

  • 利用扩展(extensions)组织代码。把某个类的代理方法的实现放进拓展,可以使代码更易维护。

    1
    2
    extension SearchViewController: UISearchBarDelegate {
        func searchBarSearchButtonClicked(searchBar: UISearchB {
            println("The search text is: '\(searchBar.text)'") 
    } }
  • 在闭包中使用weak self防止循环引用导致的内存泄露。

  • 解析 JSON 数据时,注意可选值的使用。

    1
    2
    if let resultDict = resultDict as? [String: AnyObject] {
    }
  • 可以用闭包初始化对象。

    1
    2
    3
    4
    lazy var dateFormatter: NSDateFormatter = { 
    let formatter = NSDateFormatter()
    formatter.dateStyle = .MediumStyle
    formatter.timeStyle = .ShortStyle return formatter }()
  • 网络请求时提高 UI 响应性,可以使用 GCD 的 dispatch queue.

    1
    2
    3
    4
    5
    6
    let queue = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
    dispatch_async(queue) {
    // 在后台运行的代码
    dispatch_async(dispatch_get_main_queue()) {
    // 更新UI
    }
    }
  • NSURLSession 可以取消下载任务。

    1
    2
    3
    4
    deinit {
        println("deinit \(self)")
        for task in downloadTasks {
    // 取消下载队列downloadTasks中的任务
    task.cancel() }
    }