创建常驻线程
当前环境: Xcode10.0 Swift4.2 iOS SDK 12.1
这里需要注意的是,子线程中,如果通过 GetCurrentRunLoop 方法创建 RunLoop 后,一定要给 RunLoop 添加 Timer/Source/Observer
,否则 RunLoop 会自动退出。
具体要参考:深入理解 RunLoop
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 开启 RunLoop 保活线程
let thread = Thread(target: self, selector: #selector(lanchRunloop), object: nil)
thread.start()
// 再次调用还能执行任务在这个线程
perform(#selector(foo), on: thread, with: nil, waitUntilDone: false)
// 不开启 RunLoop 线程执行完就退出
let thread1 = Thread(target: self, selector: #selector(unlanchRunloop), object: nil)
thread1.start()
// 再次调用 无法执行 因为子线程默认不会创建 RunLoop 所以执行完就会退出。
perform(#selector(foo1), on: thread1, with: nil, waitUntilDone: false)
}
@objc internal func unlanchRunloop() {
print("unlanchRunloop")
}
@objc internal func lanchRunloop() {
autoreleasepool {
print("lanchRunloop")
let currentThread: Thread = Thread.current
currentThread.name = "常驻线程"
let currentRunLoop: RunLoop = RunLoop.current
// 这里不一定非要 add NSMachPort
// 只要是 Timer Observer Source(MachPort) 添加到一种 Mode 下都可以
// 如果不添加 Timer Observer Source 那么 RunLoop 会自动退出,
// 具体可以看 RunLoop 源代码
currentRunLoop.add(NSMachPort(), forMode: .common)
currentRunLoop.run()
}
}
@objc func foo() {
print("foo!")
}
@objc func foo1() {
print("foo1!")
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: iOS 开发 - 证书问题
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论