스위프트 3, 스위프트 4 등에서 어떻게 sync, dispatch_async, dispatch_after 등을 디스패치합니까?
Swift 2.x(또는 1.x) 프로젝트에는 다음과 같은 코드가 많이 있습니다.
// Move to a background thread to do some long running work
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let image = self.loadOrGenerateAnImage()
// Bounce back to the main thread to update the UI
dispatch_async(dispatch_get_main_queue()) {
self.imageView.image = image
}
}
또는 실행을 지연시키기 위해 다음과 같은 작업을 수행합니다.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
print("test")
}
아니면 Grand Central Dispatch API의 다른 모든 종류의 사용...
스위프트 3용 Xcode 8(베타)로 프로젝트를 오픈하니 온갖 오류가 발생합니다.그들 중 일부는 내 코드를 수정할 수 있다고 제안하지만, 모든 수정이 작동 코드를 생성하는 것은 아닙니다.이거 어떻게 해야 돼요?
처음부터 Swift는 ObjC와 C를 더 스위프티로 만들기 위한 몇 가지 기능을 제공했으며 각 버전에 더 많은 기능을 추가했습니다.Swift 3에서 새로운 "구성원으로 가져오기" 기능을 사용하면 클래스처럼 작동하는 데이터 유형과 함께 작동하는 글로벌 기능이 있는 특정 스타일의 C API를 가진 프레임워크가 Swift 네이티브 API처럼 작동할 수 있습니다.데이터 유형은 Swift 클래스로 가져오고, 관련 글로벌 함수는 해당 클래스의 메서드 및 속성으로 가져오며, 상수 집합과 같은 일부 관련 항목은 적절한 경우 하위 유형이 될 수 있습니다.
Xcode 8 / Swift 3 베타에서 Apple은 디스패치 프레임워크를 훨씬 더 신속하게 만들기 위해 (다른 몇 가지 기능과 함께) 이 기능을 적용했습니다. (그리고 코어 그래픽스도 마찬가지입니다.)스위프트 오픈 소스의 노력을 따랐다면, 이것은 뉴스가 아니지만, Xcode의 일부가 된 것은 이번이 처음입니다.
프로젝트를 Swift 3으로 이동하는 첫 단계는 Xcode 8에서 프로젝트를 열고 Edit > Convert > To Current Swift Syntax...를 선택하는 것입니다.메뉴판에이렇게 하면 이름이 변경된 모든 API 및 기타 변경사항에 필요한 모든 변경사항이 한 번에 적용됩니다. (보통 한 줄의 코드는 한 번에 둘 이상의 변경사항의 영향을 받기 때문에 오류 수정에 개별적으로 대응하지 못할 수 있습니다.)
결과적으로 작업을 백그라운드 및 백그라운드로 이동하는 일반적인 패턴은 다음과 같습니다.
// Move to a background thread to do some long running work
DispatchQueue.global(qos: .userInitiated).async {
let image = self.loadOrGenerateAnImage()
// Bounce back to the main thread to update the UI
DispatchQueue.main.async {
self.imageView.image = image
}
}
사용중노트를 합니다..userInitiated▁of▁▁of.DISPATCH_QUEUE_PRIORITY상수QoS(Quality of Service) 지정자는 OS X 10.10 / iOS 8.0에 도입되어 시스템이 작업의 우선순위를 지정하고 이전의 우선순위 지정자를 더 이상 사용하지 않는 명확한 방법을 제공했습니다.자세한 내용은 백그라운드 작업 및 에너지 효율에 대한 Apple 문서를 참조하십시오.
그런데, 작업을 구성하기 위해 대기열을 유지하는 경우, 이제 대기열을 얻는 방법은 다음과 같습니다(참고:DispatchQueueAttributes이다.OptionSet따라서 컬렉션 스타일 리터럴을 사용하여 옵션을 결합합니다.):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
사용.dispatch_after나중에 일하려고요?그것도 대기열에 있는 방법이고, 그것은 시간이 걸립니다.DispatchTime다양한 숫자 유형에 대한 연산자가 있으므로 전체 또는 분수 초를 추가할 수 있습니다.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
Xcode 8에서 인터페이스를 열면 새로운 Dispatch API를 찾을 수 있습니다. Open Quick을 사용하여 Dispatch 모듈을 찾거나 기호(예:DispatchQueue) Swift 프로젝트/플레이그라운드에서 명령을 클릭한 다음 거기서 모듈을 둘러봅니다. (Apple의 세련된 새 API Reference 웹사이트와 in-Xcode doc 뷰어에서 Swift Dispatch API를 찾을 수 있지만 C 버전의 문서 콘텐츠는 아직 이동하지 않은 것 같습니다.)
자세한 정보는 마이그레이션 안내서를 참조하십시오.
Xcode 8에서 베타 4가 작동하지 않습니다...
사용:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
print("Are we there yet?")
}
비동기식의 경우 두 가지 방법:
DispatchQueue.main.async {
print("Async1")
}
DispatchQueue.main.async( execute: {
print("Async2")
})
이것은 좋은 예입니다.Swift 4대해서async:
DispatchQueue.global(qos: .background).async {
// Background Thread
DispatchQueue.main.async {
// Run UI Updates or call completion block
}
}
Xcode 8에서는 다음을 사용합니다.
DispatchQueue.global(qos: .userInitiated).async { }
Swift 5.2, 4 이상
기본 및 배경 대기열
let main = DispatchQueue.main
let background = DispatchQueue.global()
let helper = DispatchQueue(label: "another_thread")
비동기 및 동기화 스레드 작업 중!
background.async { //async tasks here }
background.sync { //sync tasks here }
비동기 스레드는 메인 스레드와 함께 작동합니다.
실행하는 동안 동기화 스레드가 기본 스레드를 차단합니다.
스위프트 4.1과 5.우리는 코드의 여러 곳에서 대기열을 사용합니다.그래서 저는 모든 큐로 스레드 클래스를 만들었습니다.스레드 클래스를 사용하지 않으려면 클래스 메소드에서 원하는 대기열 코드를 복사할 수 있습니다.
class Threads {
static let concurrentQueue = DispatchQueue(label: "AppNameConcurrentQueue", attributes: .concurrent)
static let serialQueue = DispatchQueue(label: "AppNameSerialQueue")
// Main Queue
class func performTaskInMainQueue(task: @escaping ()->()) {
DispatchQueue.main.async {
task()
}
}
// Background Queue
class func performTaskInBackground(task:@escaping () throws -> ()) {
DispatchQueue.global(qos: .background).async {
do {
try task()
} catch let error as NSError {
print("error in background thread:\(error.localizedDescription)")
}
}
}
// Concurrent Queue
class func perfromTaskInConcurrentQueue(task:@escaping () throws -> ()) {
concurrentQueue.async {
do {
try task()
} catch let error as NSError {
print("error in Concurrent Queue:\(error.localizedDescription)")
}
}
}
// Serial Queue
class func perfromTaskInSerialQueue(task:@escaping () throws -> ()) {
serialQueue.async {
do {
try task()
} catch let error as NSError {
print("error in Serial Queue:\(error.localizedDescription)")
}
}
}
// Perform task afterDelay
class func performTaskAfterDealy(_ timeInteval: TimeInterval, _ task:@escaping () -> ()) {
DispatchQueue.main.asyncAfter(deadline: (.now() + timeInteval)) {
task()
}
}
}
주 대기열의 사용을 보여주는 예입니다.
override func viewDidLoad() {
super.viewDidLoad()
Threads.performTaskInMainQueue {
//Update UI
}
}
언급URL : https://stackoverflow.com/questions/37801370/how-do-i-dispatch-sync-dispatch-async-dispatch-after-etc-in-swift-3-swift-4
'programing' 카테고리의 다른 글
| .gitignore 파일은 어디에 속합니까? (0) | 2023.05.12 |
|---|---|
| Powershell을 사용하여 한 Azure Keyvault에서 다른 Keyvault로 모든 비밀을 복사하는 방법 (0) | 2023.05.12 |
| HttpClientBaseAddress가 작동하지 않는 이유는 무엇입니까? (0) | 2023.05.12 |
| Mongo C# 드라이버 - 중첩을 사용하여 동적으로 필터 구축 (0) | 2023.05.12 |
| 프로그램이 복구를 시도하지 않아야 하는 예외는 무엇입니까? (0) | 2023.05.12 |