//
// GCD-DispatchOnce-ViewController.swift
// iOS底层
//
// Created by yanqunchao on 2019/5/21.
// Copyright © 2019 yanqunchao. All rights reserved.
//
import UIKit
class GCD_DispatchOnce_ViewController: UIViewController {
var onceToken :Int = 0
typealias dispatchBlockT = (()->())
typealias dispatchBlockInvoke = ((dispatchBlockT)->())
let semaphore = DispatchSemaphore(value: 1)
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
for _ in 0..<4 {
DispatchQueue.global().async {
self._dispatchOnce(predicate: &self.onceToken) {
print("-------创建单利")
}
}
}
print(semaphore)
}
func _dispatchOnce(predicate:UnsafeMutablePointer<Int>?,block:dispatchBlockT) {
print("进入函数------")
semaphore.wait()
print("锁住线程-------\(Thread.current)")
if predicate!.pointee != -1 {
dispatch_once_f(predicate: predicate, ctxt: block, invokeFunc: _dispatch_Block_invoke)
} else {
print("开启线程-------\(Thread.current)")
semaphore.signal()
}
}
func dispatch_once_f(predicate:UnsafeMutablePointer<Int>?,ctxt:dispatchBlockT,invokeFunc:@escaping dispatchBlockInvoke) {
invokeFunc(ctxt)
predicate!.pointee = -1
print("开启线程-------\(Thread.current)")
semaphore.signal()
}
func _dispatch_Block_invoke(block:dispatchBlockT) {
block()
}
}
iOS原理之CGD-dispatch_once的底层实现
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 3.2.12 dispatch_once dispatch_once 函数是保证在应用程序执行中执行一次指定处理的...