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`
}
이러한 대기열 사용에 대해 알아보려면 다음과 같이 하십시오.이 답변 보기
>=Domino 3 아래에 컴파일합니다.이 예제에는 필요한 구문의 대부분이 포함되어 있습니다.
QoS - 새로운 QoS 구문
weak self
주기를
셀프 서비스를 사용할 수 없으면 아무것도 하지 않습니다.
async global utility 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 스레드 우선 순위로 작업을 실행하지 않는 것이 좋습니다.
다음은 버퍼링을 통해 XML 파일을 읽고 데이터 보간을 수행하는 계산 집약적인 함수의 실제 데이터입니다.
장치 이름 / .background / .utility / .default / .userInitiated / .user대화형
- 아이폰X: 18.7s/6.3s/1.8s/1.8s/1.8s
- 아이폰 7: 4.6s / 3.1s / 3.0s / 2.8s / 2.6s
- 아이폰 5s: 7.3s/6.1s/4.0s/4.0s/3.8s
모든 장치에서 데이터 세트가 동일한 것은 아닙니다.그것은 아이폰 X에서 가장 크고 아이폰 5s에서 가장 작습니다.
swift 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
}
Apple 설명서에서:
매개변수
라벨.
계측기, 샘플, 스택샷 및 충돌 보고서와 같은 디버깅 도구에서 큐를 고유하게 식별하기 위해 큐에 부착할 문자열 레이블입니다.응용 프로그램, 라이브러리 및 프레임워크는 모두 고유한 발송 대기열을 생성할 수 있으므로 역방향 DNS 명명 스타일(com.example.myqueue)을 사용하는 것이 좋습니다.이 매개 변수는 선택 사항이며 NULL일 수 있습니다.
qos
대기열과 연결할 서비스 품질 수준입니다.이 값은 시스템이 실행할 태스크를 예약하는 우선 순위를 결정합니다.가능한 값 목록은 DispatchQoS를 참조하십시오.QoS 클래스.
특성
대기열과 연결할 특성입니다.동시 속성을 포함하여 태스크를 동시에 실행하는 발송 대기열을 만듭니다.이 속성을 생략하면 디스패치 대기열은 태스크를 순차적으로 실행합니다.
자동 해제 주파수
대기열이 예약하는 블록에서 생성된 개체를 자동으로 릴리스하는 빈도입니다.가능한 값 목록은 디스패치 대기열을 참조하십시오.자동 해제 주파수.
표적의
블록을 실행할 대상 대기열입니다.시스템에서 현재 개체에 적합한 대기열을 제공하려면 DISPATE_TARGET_QUUE_DEFAULT를 지정합니다.
이 작업을 수행했습니다. UI를 새로 고쳐 사용자가 눈치채지 못하게 새 데이터를 표시하려면 특히 중요합니다(예: UITableView 또는 UIPickerView).
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
}
스위프트 3용
DispatchQueue.main.async {
// Write your code here
}
let newQueue = DispatchQueue(label: "newname")
newQueue.sync {
// your code
}
이제 간단하게:
let serialQueue = DispatchQueue(label: "my serial queue")
기본값은 serial입니다. 동시에 사용하려면 선택적 특성 인수 .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
'programing' 카테고리의 다른 글
다른 어셈블리의 두 부분 클래스가 같은 클래스를 나타내는 것이 가능합니까? (0) | 2023.05.21 |
---|---|
Node.js 'require'를 절대로 만들려면 어떻게 해야 합니까?(상대값 제외) (0) | 2023.05.21 |
페이지화를 위해 MongoDB 집계를 사용하는 방법은 무엇입니까? (0) | 2023.05.21 |
인라인 CSS에서 'a:hover'를 어떻게 쓸 수 있습니까? (0) | 2023.05.21 |
스택과 힙은 무엇이며 어디에 있습니까? (0) | 2023.05.21 |