多线程开发 - 异步
public typealias Task = () -> Void
public class Asyncs {
public static func async(_ task: @escaping Task) {
_async(task)
}
public static func async(_ task: @escaping Task,
_ mainTask: @escaping Task) {
_async(task, mainTask)
}
private static func _async(_ task: @escaping Task,
_ mainTask: Task? = nil) {
let item = dispatchWorkItem(block: task)
dispatchQueue.global().async(execute: item)
if let main = mainTask {
item.notify(queue: dispatchQueue.main, execute: main)
}
}
}
Asyncs.async({
print(1, Thread.current)
}) {
print(2, Thread.current)
}
1 <NSThread: 0x6000033ec540>{number = 3, name = (null)}
2 <NSThread: 0x600003383bc0>{number = 1, name = main}
多线程开发 - 延迟
public typealias Task = () -> Void
public class Asyncs {
@discardableResult
public static func delay(_ seconds: Double,
_ block: @escaping Task) -> dispatchWorkItem {
let item = dispatchWorkItem(block: block)
dispatchQueue.main.asyncAfter(deadline: dispatchTime.Now() + seconds, execute: item)
return item
}
}
Asyncs.delay(3) {
print(1)
}
多线程开发 - 异步延迟
public typealias Task = () -> Void
public class Asyncs {
@discardableResult
public static func asyncDelay(_ seconds: Double,
_ task: @escaping Task) -> dispatchWorkItem {
let item = _asyncDelay(seconds, task)
return item
}
@discardableResult
public static func asyncDelay(_ seconds: Double,
_ task: @escaping Task,
_ mainTask: @escaping Task) -> dispatchWorkItem {
let item = _asyncDelay(seconds, task, mainTask)
return item
}
private static func _asyncDelay(_ seconds: Double,
_ task: @escaping Task,
_ mainTask: Task? = nil) -> dispatchWorkItem {
let item = dispatchWorkItem(block: task)
dispatchQueue.global().asyncAfter(deadline: dispatchTime.Now() + seconds, execute: item)
if let main = mainTask {
item.notify(queue: dispatchQueue.main, execute: main)
}
return item
}
}
print(1)
Asyncs.asyncDelay(3, {
print(2)
}) {
print(3)
}
- 返回dispatchWorkItem,是因为可以cancel
多线程开发 - once
let age1: Int = {
print(666)
return 10
}()
class ViewController: UIViewcontroller {
static let age2: Int = {
print(888)
return 20
}()
override func viewDidLoad() {
super.viewDidLoad()
print(age1)
print(age1)
// 666 10 10
print(ViewController.age2)
print(ViewController.age2)
// 888 20 20
}
}
- 多线程开发 - 加锁
public struct Cache {
private static var data = [String: Any]()
// private static var lock = dispatchSemaphore(value: 1)
// private static var lock = NSLock()
private static var lock = NSRecursiveLock()
public static func get(_ key: String) -> Any? {
return data[key]
}
public static func set(_ key: String, _ value: Any) {
// lock.wait()
// defer {
// lock.signal()
// }
lock.lock()
defer {
lock.unlock()
}
data[key] = value
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。