Swift 3에서 디스패치 큐를 생성하는 방법
Swift 2에서는 다음 코드를 사용하여 대기열을 만들 수있었습니다.
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
그러나 이것은 Swift 3에서 컴파일되지 않습니다.
Swift 3에서 이것을 작성하는 선호되는 방법은 무엇입니까?
동시 큐 작성
let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {
}
시리얼 큐 생성
let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync {
}
기본 대기열을 비동기 적으로 가져 오기
DispatchQueue.main.async {
}
메인 큐를 동 기적으로 가져 오기
DispatchQueue.main.sync {
}
백그라운드 스레드 중 하나를 얻으려면
DispatchQueue.global(qos: .background).async {
}
Xcode 8.2 베타 2 :
백그라운드 스레드 중 하나를 얻으려면
DispatchQueue.global(qos: .default).async {
}
DispatchQueue.global().async {
// qos' default value is ´DispatchQoS.QoSClass.default`
}
이 대기열 사용에 대해 배우려면이 답변을 참조하십시오.
스위프트 3에서 컴파일합니다 . 이 예에는 필요한 대부분의 구문이 포함되어 있습니다.
QoS-새로운 서비스 품질 구문
weak self
-유지주기 중단
자아를 구할 수 없으면 아무 것도하지 마십시오
async global background queue
-네트워크 쿼리 용
async main queue
-UI를 터치합니다.
물론, 이것에 약간의 오류 검사를 추가해야합니다 ...
DispatchQueue.global(qos: .utility).async { [weak self] () -> Void in
guard let strongSelf = self else { return }
strongSelf.flickrPhoto.loadLargeImage { loadedFlickrPhoto, error in
if error != nil {
print("error:\(error)")
} else {
DispatchQueue.main.async { () -> Void in
activityIndicator.removeFromSuperview()
strongSelf.imageView.image = strongSelf.flickrPhoto.largeImage
}
}
}
}
XCode 8, Swift 3에서 컴파일 https://github.com/rpthomas/Jedisware
@IBAction func tap(_ sender: AnyObject) {
let thisEmail = "emailaddress.com"
let thisPassword = "myPassword"
DispatchQueue.global(qos: .background).async {
// Validate user input
let result = self.validate(thisEmail, password: thisPassword)
// Go back to the main thread to update the UI
DispatchQueue.main.async {
if !result
{
self.displayFailureAlert()
}
}
}
}
OP 질문에 이미 답변되었으므로 속도 고려 사항을 추가하고 싶습니다.
DispatchQueue.global 에서 비동기 함수에 할당하는 우선 순위 클래스에 많은 차이가 있습니다 .
저전력 코어에 작업이 할당 된 것처럼 보이는 iPhone X에서 .background thread 우선 순위로 작업을 실행하지 않는 것이 좋습니다 .
다음은 XML 파일에서 버퍼링을 읽고 데이터 보간을 수행하는 계산 집약적 인 함수의 실제 데이터입니다.
장치 이름 / .background / .utility / .default / .userInitiated / .userInteractive
- 아이폰 X : 18.7 초 / 6.3 초 / 1.8 초 / 1.8 초 / 1.8 초
- 아이폰 7 : 4.6s / 3.1s / 3.0s / 2.8s / 2.6s
- 아이폰 5s : 7.3s / 6.1s / 4.0s / 4.0s / 3.8s
데이터 세트가 모든 장치에 대해 동일하지는 않습니다. iPhone X에서 가장 크고 iPhone 5에서 가장 작습니다.
나는 이것을했고 UITableView 또는 UIPickerView와 같이 사용자에게 알리지 않고 새 데이터를 표시하기 위해 UI를 새로 고치려는 경우 특히 중요합니다.
DispatchQueue.main.async
{
/*Write your thread code here*/
}
DispatchQueue.main.async {
self.collectionView?.reloadData() // Depends if you were populating a collection view or table view
}
OperationQueue.main.addOperation {
self.lblGenre.text = self.movGenre
}
// 뷰 컨트롤러에서 객체 (라벨, 이미지 뷰, 텍스트 뷰)를 채워야하는 경우 작업 대기열을 사용합니다.
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT) //Swift 2 version
let concurrentQueue = DispatchQueue(label:"com.swift3.imageQueue", attributes: .concurrent) //Swift 3 version
Xcode 8, Swift 3에서 코드를 다시 작성했으며 Swift 2 버전과 달리 변경 사항이 표시되어 있습니다.
스위프트 3
신속한 코드로 클로저를 호출하고 스토리 보드에서 변경하고 싶을 때 나중에 유형을 변경하면 응용 프로그램이 중단됩니다.
하지만 응용 프로그램이 중단되지 않는 디스패치 방법을 사용하려고합니다.
비동기 방법
DispatchQueue.main.async
{
//Write code here
}
동기화 방법
DispatchQueue.main.sync
{
//Write code here
}
DispatchQueue.main.async(execute: {
// write code
})
시리얼 큐 :
let serial = DispatchQueue(label: "Queuename")
serial.sync {
//Code Here
}
동시 대기열 :
let concurrent = DispatchQueue(label: "Queuename", attributes: .concurrent)
concurrent.sync {
//Code Here
}
let newQueue = DispatchQueue(label: "newname")
newQueue.sync {
// your code
}
스위프트 3
DispatchQueue.main.async {
// Write your code here
}
신속한 5 업데이트
시리얼 큐
let serialQueue = DispatchQueue.init(label: "serialQueue")
serialQueue.async {
// code to execute
}
동시 대기열
let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
concurrentQueue.async {
// code to execute
}
에서 애플 문서 :
매개 변수
상표
계측기, 샘플, 스택 샷 및 충돌 보고서와 같은 디버깅 도구에서 고유하게 식별하기 위해 대기열에 첨부 할 문자열 레이블입니다. 응용 프로그램, 라이브러리 및 프레임 워크는 모두 고유 한 디스패치 큐를 만들 수 있으므로 역방향 DNS 이름 지정 스타일 (com.example.myqueue)이 권장됩니다. 이 매개 변수는 선택 사항이며 NULL 일 수 있습니다.
qos
큐와 연관시킬 서비스 품질 레벨. 이 값은 시스템이 작업 실행을 예약하는 우선 순위를 결정합니다. 가능한 값 목록은 DispatchQoS.QoSClass를 참조하십시오.
속성
큐와 연관시킬 속성입니다. 태스크를 동시에 실행하는 디스패치 큐를 작성하려면 동시 속성을 포함하십시오. 해당 속성을 생략하면 디스패치 큐가 작업을 순차적으로 실행합니다.
자동 릴리스
대기열이 예약 한 블록에 의해 생성 된 객체를 자동 해제하는 빈도입니다. 가능한 값 목록은 DispatchQueue.AutoreleaseFrequency를 참조하십시오 .
표적
블록을 실행할 대상 큐입니다. 시스템이 현재 오브젝트에 적합한 큐를 제공하도록하려면 DISPATCH_TARGET_QUEUE_DEFAULT를 지정하십시오.
이제는 간단합니다 :
let serialQueue = DispatchQueue(label: "my serial queue")
기본값은 직렬이며, 동시에 얻으려면 선택적 속성 인수 .concurrent를 사용하십시오.
DispatchQueue.main.async(execute: {
// code
})
swift 3.0에서이 코드를 사용하여 디스패치 큐를 생성 할 수 있습니다
DispatchQueue.main.async
{
/*Write your code here*/
}
/* or */
let delayTime = DispatchTime.now() + Double(Int64(0.5 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
DispatchQueue.main.asyncAfter(deadline: delayTime)
{
/*Write your code here*/
}
참고 URL : https://stackoverflow.com/questions/37805885/how-to-create-dispatch-queue-in-swift-3
'development' 카테고리의 다른 글
왜 IDE를 사용해야합니까? (0) | 2020.02.23 |
---|---|
JavaScript에서 base64 문자열로 Blob 만들기 (0) | 2020.02.23 |
macOS에서 터미널에서 숭고한 텍스트 열기 (0) | 2020.02.23 |
생성자 또는 선언시 클래스 필드를 초기화 하시겠습니까? (0) | 2020.02.23 |
iOS 10 : "[App] 실제 사전 커밋 핸들러에있는 경우 CA 제한으로 인해 실제로 새 펜스를 추가 할 수 없습니다" (0) | 2020.02.23 |