swift5.x 多线程的应用场景

2020-12-25 16:27

阅读:473

标签:强制   serve   lang   err   刷新   control   opera   多线程下载   请求   

//
//  ViewController17.swift
//  swiftT
//
//  Created by wjwdive on 2020/6/3.
//  Copyright ? 2020 wjwdive. All rights reserved.
//

import UIKit

class ViewController17: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //线程不安全的示例
//        noThreadSafeSimple()
        //线程安全的示例
        ThreadSafeSimple()
        //线程安全的 优化读写操作示例
        betterThreadSafeArraySimple()
    }

}

//多线程的应用场景
//1 一个也没有三个网络请求,需要再三个网络请求返回的时候刷新界面
//2 需要一个线程安全的Array的读写
//3 编写一个多线程下载器,可执行多个下载任务,每个任务可以保存当下下载的字节数,总字节数,可以设置回调得到当前下载进度
//4 需要再主线程等待一个异步任务返回,才能继续执行下面的逻辑,但是又不希望堵塞用户事件。

//1 一个也没有三个网络请求,需要再三个网络请求返回的时候刷新界面
//实现:
// 三个网络请求分别是一个Operation,刷新界面是一个Operation,刷新界面的Operation依赖三个网络请求的Operation。这样就能保证三个网络请求都成功之后才刷新界面。


//2 需要一个线程安全的Array的读写
// 不做线程安全处理出错的示例:
//线程A
//线程B
//1??线程A获取Array的长度length
//2??线程B删除了Array的最后一个元素
//3??线程A根据length 读取Array的最后一个元素,这时就会出错


//线程不安全的示例:
func noThreadSafeSimple() {
    //线程不安全的示例
    var array = Array(0...10000)
    func getLastItem() -> Int? {
        var temp: Int? = nil
        if array.count > 0 {
            temp = array[array.count - 1] //这行代码在获取array长度之后,可能中间有另一个线程在remove元素,之后在取最后一个元素,出现数组越界。
        }
        return temp
    }
    
    func removeLastItem() {
        array.removeLast()
    }
    
    let queue = DispatchQueue(label:"queue1")
    queue.async {
        for _ in 0.. Int? {
        var temp: Int? = nil
        lock.lock()
        if array.count > 0 {
            temp = array[array.count - 1] //这行代码在获取array长度之后,可能中间有另一个线程在remove元素,之后在取最后一个元素,出现数组越界。
        }
        lock.unlock()//解锁
        return temp
    }
    
    func removeLastItem() {
        lock.lock()
        array.removeLast()
        lock.unlock()
    }
    
    let queue = DispatchQueue(label:"queue1")
    queue.async {
        for _ in 0.. Int? {
        var temp: Int? = nil
        concurrentQueue.sync {
            if array.count > 0 {
                temp = array[array.count - 1]
            }
        }
        return temp
    }
    
    func removeLastItem() {
        let workItem = DispatchWorkItem(qos: DispatchQoS.default, flags: DispatchWorkItemFlags.barrier) {
            array.removeLast()
        }
        concurrentQueue.async(execute: workItem)
    }
}

swift5.x 多线程的应用场景

标签:强制   serve   lang   err   刷新   control   opera   多线程下载   请求   

原文地址:https://www.cnblogs.com/wjw-blog/p/13038567.html


评论


亲,登录后才可以留言!