GCD(Grand Central Dispatch)를 통해 큐의 순서와 속도를 제어하는 방법(2/2)
5. .conceurent 속성 /.initiallynactive 속성
DispatchQue는 label과qos 이외에attributes의 속성을 추가할 수 있습니다.
및 conceurent두 initiallynactive가 있는데 둘 다 큐가 아닌 Work Item을 제어합니다.
A .concurrent
동일한 대기열에서 Work Item의 속성을 동시에 처리합니다.(결과는 아래 A 그림)
let anotherQueue = DispatchQueue(label: "com.ayakosayama.anotherQueue", qos: .utility, attributes: .concurrent)
func attribuesTest(){
anotherQueue.async {
for i in 0..<10{
print("🔵",i)
}
}
anotherQueue.async {
for i in 100..<110{
print("🔴",i)
}
}
anotherQueue.async {
for i in 1000..<1010{
print("⚫️",i)
}
}
}
B .initiallyInactive
직원을 대기열에서 WorkItem을 기다리게 합니다.단독으로 쓰지 않으면 실행 처리를 시작할 수 없습니다.(결과는 다음 그림 B)
var inactiveQueue: DispatchQueue!
let anotherQueue = DispatchQueue(label: "com.appcoda.anotherQueue", qos: .utility, attributes: .initiallyInactive)
func attribuesTest(){
inactiveQueue = anotherQueue
anotherQueue.async {
for i in 0..<10{
print("🔵",i)
}
}
anotherQueue.async {
for i in 100..<110{
print("🔴",i)
}
}
anotherQueue.async {
for i in 1000..<1010{
print("⚫️",i)
}
}
}
실행 방법
attribuesTest()
if let queue = inactiveQueue{
queue.activate()
}
6. 글로벌()로 프리킥 무작위 선택
지금까지 사용자 정의 대기열을 직접 만들었지만, 시스템이 백엔드에서 만든 디스패치 queue의 소장품, 즉 글로벌 대기열을 사용할 수도 있다.
func globalQueue(){
let globalQueue = DispatchQueue.global()
globalQueue.async {
print(globalQueue.label) // com.apple.root.default-qos
for i in 1..<1000{ print("⚫️",i)}
}
}
이 경우 처리가 짧고 사용되지 않기 때문에 기본 QOS를 선택했습니다.7. delayqueue.asyncaAfter()로 대기열 지연 시간 제어하기
아래와 같이 대기열 처리를 2초 늦추는 프로그램을 적어서 실행해 보십시오.
func queueWithDelay(){
print(Date())
let delayqueue = DispatchQueue(label: "com.ayakosayama.delayqueue", qos: .userInteractive)
let additinalTime:DispatchTimeInterval = .seconds(2)
delayqueue.asyncAfter(deadline: .now() + additinalTime){
print(Date())
}
}
결과:마침 2초 늦었어요.2017-07-11 21:14:13 +0000
2017-07-11 21:14:15 +0000
8. 콜백 함수로 다운로드한 UI에 이미지 그리기
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var label: UILabel!
func fetchImage(){
label.text = "downloading..."
let imageURL: URL = URL(string: "https://worldstrides.com/wp-content/uploads/2015/07/12-Chureito-pagoda-and-Mount-Fuji-Japan.jpg")!
(URLSession(configuration: URLSessionConfiguration.default)).dataTask(with: imageURL, completionHandler: { (imageData, response, error) in
if let data = imageData {
DispatchQueue.main.async {
self.label.text = "finished downloading!"
self.imageView.image = UIImage(data: data)
}
}
}).resume()
}
이미지 뷰에 이미지를 표시하려면!이런 처리이미지를 다운로드하기 전에 UI에 표시된 명령을 실행하면 다운로드가 끝나도 표시되지 않습니다.
그러므로 위에서 말한 바와 같다
DispatchQueue.main.async{}로 덮어쓸 수 있습니다.
끝났어!
원자재여기.!
Gihtub 코드는 여기.입니다!
Reference
이 문제에 관하여(GCD(Grand Central Dispatch)를 통해 큐의 순서와 속도를 제어하는 방법(2/2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Saayaman/items/59371bb8dc97f1d21e62텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)