哎哟,这次作业要使用多线程了,不过读者们不要慌,Swift的多线程如果不设计特别复杂的锁的话,是很简单的,那我们先来看看要求吧
这次的作业要求不多,可能刚接触时会觉得多线程比较麻烦,其实不然,Swift中的GCD已经非常方便了,我们只需要使用它就可以很简单地实现我们的要求。那接下来我们就开始完成需求吧。
首先,我们需要声明一个UILabel控件来显示计算的结果
var label: UILabel!
然后我们需要在界面中添加一个按钮,当我们点击该按钮之后,就开始进行大数加的运算。并且我们为了验证界面是否卡顿,我们需要想界面中添加一个UITextView,并向其中添加多行文字,因为UITextView可以滚动,所以如果我们的界面卡顿的话,UITextView就不能滚动了。
self.view.backgroundColor = UIColor.white
let btn = UIButton(frame: CGRect(x: 20, y: 50, width: 100, height: 44))
btn.setTitle("开始运算", for: .normal)
btn.setTitleColor(UIColor.black, for: .normal)
btn.setTitleColor(UIColor.brown, for: .highlighted)
btn.layer.borderWidth = 1
btn.addTarget(self, action: #selector(startCalculate), for: .touchUpInside)
self.view.addSubview(btn)
label = UILabel(frame: CGRect(x: 20, y: 100, width: 300, height: 44))
label.text = "1"
label.textColor = UIColor.black
self.view.addSubview(label)
let text = """
hhh
hhhh
hhhhh
hhhhh
hhh
hsaofhwe
asfdh
fewh
aflew
fwei
fwi
fwh
sasdf
"""
let textView = UITextView(frame: CGRect(x: 10, y: 200, width: self.view.frame.width - 20, height: self.view.frame.height - 250))
textView.text = text
textView.textColor = UIColor.black
textView.textAlignment = .center
textView.layer.borderWidth = 1
textView.font = UIFont.systemFont(ofSize: 44)
self.view.addSubview(textView)
到这里我们的界面就完成了,最后只需要实现按钮的功能即可
@objc func startCalculate() {
DispatchQueue.global().async {
var number = 0
for num in 1...9999999 {
number += num
DispatchQueue.main.async {
self.label.text = "\(number)"
}
}
}
}
在这个方法中,我们首先使用GCD中的全局队列的异步方法进行大数加的运算,没做一次运算就更新UILabel中显示的数据,因为UILabel是界面显示的空间,在Swift中所有对界面的更新要求必须在主线程中进行,因为系统会不定期地刷新界面,如果不在主线程中,那么界面就会出现意想不到的错误,所以Swift要求界面的更新操作必须在主线程中。
然后,就没有然后了,我们可以看看最终运行的效果(对!就是这么简单)
最后贴一下所有的代码吧
ViewController.swift
import UIKit
class ViewController: UIViewController {
var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = UIColor.white
let btn = UIButton(frame: CGRect(x: 20, y: 50, width: 100, height: 44))
btn.setTitle("开始运算", for: .normal)
btn.setTitleColor(UIColor.black, for: .normal)
btn.setTitleColor(UIColor.brown, for: .highlighted)
btn.layer.borderWidth = 1
btn.addTarget(self, action: #selector(startCalculate), for: .touchUpInside)
self.view.addSubview(btn)
label = UILabel(frame: CGRect(x: 20, y: 100, width: 300, height: 44))
label.text = "1"
label.textColor = UIColor.black
self.view.addSubview(label)
let text = """
hhh
hhhh
hhhhh
hhhhh
hhh
hsaofhwe
asfdh
fewh
aflew
fwei
fwi
fwh
sasdf
"""
let textView = UITextView(frame: CGRect(x: 10, y: 200, width: self.view.frame.width - 20, height: self.view.frame.height - 250))
textView.text = text
textView.textColor = UIColor.black
textView.textAlignment = .center
textView.layer.borderWidth = 1
textView.font = UIFont.systemFont(ofSize: 44)
self.view.addSubview(textView)
}
@objc func startCalculate() {
DispatchQueue.global().async {
var number = 0
for num in 1...9999999 {
number += num
DispatchQueue.main.async {
self.label.text = "\(number)"
}
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}