development

Swift 3에서 디스패치 큐를 생성하는 방법

big-blog 2020. 2. 23. 11:56
반응형

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

  1. 아이폰 X : 18.7 초 / 6.3 초 / 1.8 초 / 1.8 초 / 1.8 초
  2. 아이폰 7 : 4.6s / 3.1s / 3.0s / 2.8s / 2.6s
  3. 아이폰 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



반응형