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

哎哟,这次作业要使用多线程了,不过读者们不要慌,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.
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值