develop
Blocking, Non-blocking 본문
반응형
blocking vs non-blocking
blocking
class Network {
var isLoading = false
func blocking() -> Bool {
print("start date: \(Date().timeIntervalSince1970)")
sleep(1)
print("end date: \(Date().timeIntervalSince1970)")
return true
}
}
class Example {
init() {
let network = Network()
let result = network.blocking()
print("complete \(result) date: \(Date().timeIntervalSince1970)")
}
}
start date: 1544249905.254097
end date: 1544249906.254911
complete true date: 1544249906.25496
블러킹은 함수를 호출 했을 때 결과가 나올 때까지 함수를 반환하지 않는다.
non-blocking
class Network {
var isLoading = false
func nonBlocking() {
DispatchQueue.global().asyncAfter(deadline: .now() + 0.1) {
self.isLoading = true
print("start date: \(Date().timeIntervalSince1970)")
sleep(1)
self.isLoading = false
print("end date: \(Date().timeIntervalSince1970)")
}
}
}
class Example {
init() {
let network = Network()
network.nonBlocking()
print("complete \(network.isLoading) date: \(Date().timeIntervalSince1970)")
}
}
complete false date: 1544250075.108323
start date: 1544250075.214427
end date: 1544250076.21679
넌블러킹은 함수를 호출 했을 때 바로 반환하고 다른 작업을 수행할 수 있다.
Sync vs Async
Sync(동기)
class Network {
var isLoading = false
func sync() -> Bool {
return true
}
}
class Example {
init() {
let network = Network()
let value = network.sync()
}
}
함수의 작업 완료를 기다린다.
Async(비동기)
class Network {
var isLoading = false
func async(_ callback: @escaping () -> Void) {
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
callback()
}
}
}
class Example {
init() {
let network = Network()
network.async {
print("complete")
}
}
}
함수의 작업 완료를 기다리지 않고 callback으로 받는다.
Sync-Blocking
class Network {
var isLoading = false
func syncBlocking() -> Bool {
sleep(1)
return true
}
}
class Example {
init() {
let network = Network()
let value = network.syncBlocking()
}
}
싱크 블러킹은 함수를 호출 후 리턴 될때 까지 아무 작업을 할수 없다.
함수의 작업 내용이 작거나 시간이 아주 작게 걸릴 때 사용된다.
그렇지 않으면 앱이 프리즈 상태가 될 가능성이 많다.
Sync-NonBlocking
class Network {
var isLoading = false
func syncNonBlocking() -> Bool {
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
print("work")
}
return true
}
}
class Example {
init() {
let network = Network()
let value = network.syncNonBlocking()
}
}
싱크 논블러킹은 함수를 호출 후 바로 리턴받고 다른 작업을 할수 있다.
해당 함수의 작업 결과가 중요하지 않을 경우 사용한다.
Async-Blocking
class Network {
var isLoading = false
func asyncBlocking(_ callback: () -> Void) {
sleep(1)
callback()
}
}
class Example {
init() {
let network = Network()
network.asyncBlocking {
}
}
}
어싱크 블로킹은 콜백 호출까지 다른 작업을 할 수 없다.
거의 사용 되지 않는다.
Async-NonBlocking
class Network {
var isLoading = false
func asyncNonBlocking(_ callback: @escaping () -> Void) {
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
callback()
}
}
}
class Example {
init() {
let network = Network()
network.asyncNonBlocking {
print("complete")
}
print("other work")
}
}
어싱크 논블러킹은 콜백 호출 전에 다른 작업이 가능하다.
함수에서 작업이 완료되면 콜백이 호출된다.
가장 많이 쓰이는 형태이다.
반응형
'iOS' 카테고리의 다른 글
Higher Order Functions 고차함수 (0) | 2021.01.12 |
---|---|
AutoLayout (0) | 2021.01.11 |
Semaphore (0) | 2021.01.09 |
AssociatedType (0) | 2021.01.08 |
Convenience init (0) | 2021.01.07 |
Comments