技术要点
“电影热搜”是我个人开发的第一个 iOS 应用。去年冬天,在初步熟悉了 Swift 语法之后,我参考 iOS Apprentice 第四款应用的源码,在此基础上完成了自己的应用。说起来,从零基础到做出一个完整的应用并不需要太多时间的投入。只是一旦入坑,就知道自己所要学习的东西还有太多。这个应用主要是用来熟悉苹果公司推荐的新技术,并没有用第三方的类库。下面是开发这个应用的一些要点:
- 使用 MVC 架构;
- Storyboard 快速构建界面;
- Auto Layout 支持各类型设备的自动布局;
- NSURLSession 处理网络请求、下载图片;
- NSJSONSerialization 解析 JSON 数据;
- 异步网络请求,防止阻塞主线程;
- Presentation Controller 实现页面跳转效果;
- Core Data 进行用户数据的传递和存储,遵循依赖注入原则;
- 对屏幕旋转做界面适配。
- 全面采用原生 API ,提高应用运行效率。
备忘
把常量定义放入结构体,便于后续使用。
1
2struct TableViewCellIdentifiers {
static let searchResultCell = "SearchResultCell" }在 TableView Cell 中如果出现加载网络图片的需求,应先用占位图片显示,再异步加载网络图片。实现类似功能,还可以用代理(proxy)设计模式,创建一个缩略图代理类,在后台进行实际图像的懒加载。
利用扩展(extensions)组织代码。把某个类的代理方法的实现放进拓展,可以使代码更易维护。
1
2extension SearchViewController: UISearchBarDelegate { func searchBarSearchButtonClicked(searchBar: UISearchB { println("The search text is: '\(searchBar.text)'")
} }
在闭包中使用
weak self
防止循环引用导致的内存泄露。解析 JSON 数据时,注意可选值的使用。
1
2if let resultDict = resultDict as? [String: AnyObject] {
}可以用闭包初始化对象。
1
2
3
4lazy var dateFormatter: NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.dateStyle = .MediumStyle
formatter.timeStyle = .ShortStyle return formatter }()网络请求时提高 UI 响应性,可以使用 GCD 的 dispatch queue.
1
2
3
4
5
6let queue = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) dispatch_async(queue) {
// 在后台运行的代码
dispatch_async(dispatch_get_main_queue()) {
// 更新UI
}
}NSURLSession 可以取消下载任务。
1
2
3
4deinit { println("deinit \(self)") for task in downloadTasks {
// 取消下载队列downloadTasks中的任务
task.cancel() }
}