有一些代码结构上可能会采用模型驱动UI的方式来展示界面,这种时候一般都比较喜欢把需要使用到的 uiviewcontroller 都给初始化好了,然后用的时候直接使用就好了,但是这样一般来说会导致启动的时候初始化占用大量的内存、启动时间长等问题。
对于这种如果编写一个延时加载函数之类的可能也比较麻烦,在 swift 中正好有一个新特性来解决这个问题。 lazy~
创建一个 LazyViewController 函数:
import UIKit
class LazyViewController : UIViewController {
var name: String!
var arr: [Int]! // 主要为了看一下内存占用
override func viewDidLoad() {
super.viewDidLoad()
arr = [Int](repeating: 0, count: 1000000)
print("loading ", name!, Date().timeIntervalSince1970)
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
convenience init(name : String?) {
self.init()
self.name = name
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
在主控代码中尝试延时加载
import UIKit
class MainViewController: UIViewController {
lazy var lazy0 : LazyViewController = { return LazyViewController.init(name: "lazy0") }()
lazy var lazy1 : LazyViewController = { return LazyViewController.init(name: "lazy1") }()
lazy var lazy2 : LazyViewController = { return LazyViewController.init(name: "lazy2") }()
lazy var lazy3 : LazyViewController = { return LazyViewController.init(name: "lazy3") }()
lazy var lazy4 : LazyViewController = { return LazyViewController.init(name: "lazy4") }()
func getLazy0ViewController() -> LazyViewController {
return lazy0
}
func getLazy1ViewController() -> LazyViewController {
return lazy1
}
func getLazy2ViewController() -> LazyViewController {
return lazy2
}
func getLazy3ViewController() -> LazyViewController {
return lazy3
}
func getLazy4ViewController() -> LazyViewController {
return lazy4
}
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(getLazy0ViewController().view)
var t = DispatchTime.now() + 10
DispatchQueue.main.asyncAfter(deadline: t) {
self.view.addSubview(self.getLazy1ViewController().view)
}
t = DispatchTime.now() + 20
DispatchQueue.main.asyncAfter(deadline: t) {
self.view.addSubview(self.getLazy2ViewController().view)
}
t = DispatchTime.now() + 30
DispatchQueue.main.asyncAfter(deadline: t) {
self.view.addSubview(self.getLazy3ViewController().view)
}
t = DispatchTime.now() + 40
DispatchQueue.main.asyncAfter(deadline: t) {
self.view.addSubview(self.getLazy4ViewController().view)
}
}
}
最终效果如下:
感觉还挺不错的啊~
每隔10秒使用一下 LazyViewController ,用的时候才去初始化。