(作业)使用多线程实现一个大数加程序

来源:互联网 发布:ios未越狱修改数据 编辑:程序博客网 时间:2024/06/03 13:08

哎哟,这次作业要使用多线程了,不过读者们不要慌,Swift的多线程如果不设计特别复杂的锁的话,是很简单的,那我们先来看看要求吧
这里写图片描述

这次的作业要求不多,可能刚接触时会觉得多线程比较麻烦,其实不然,Swift中的GCD已经非常方便了,我们只需要使用它就可以很简单地实现我们的要求。那接下来我们就开始完成需求吧。

首先,我们需要声明一个UILabel控件来显示计算的结果

var label: UILabel!

然后我们需要在界面中添加一个按钮,当我们点击该按钮之后,就开始进行大数加的运算。并且我们为了验证界面是否卡顿,我们需要想界面中添加一个UITextView,并向其中添加多行文字,因为UITextView可以滚动,所以如果我们的界面卡顿的话,UITextView就不能滚动了。

self.view.backgroundColor = UIColor.whitelet 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 = 1btn.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.blackself.view.addSubview(label)let text = """    hhh    hhhhhhhhhhhhhhhhhhsaofhweasfdhfewhaflewfweifwifwhsasdf"""let textView = UITextView(frame: CGRect(x: 10, y: 200, width: self.view.frame.width - 20, height: self.view.frame.height - 250))textView.text = texttextView.textColor = UIColor.blacktextView.textAlignment = .centertextView.layer.borderWidth = 1textView.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 UIKitclass 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.    }}
原创粉丝点击