kihyun12050814
@kihyun12050814
Reviews Written
3
Average Rating
5.0
Posts
Q&A
ํ๋ ์์ํฌ ์ ํ์ ๊ดํ์ฌ ์ง๋ฌธ์ด ์์ต๋๋ค.
๋ต๋ณ๊ฐ์ฌํฉ๋๋ค! ๋ค๋ฅธ ํ๋ ์์ํฌ์ ๋นํด ๋ฑํ ์ฅ์ ์ด ๋ ์๋ ๊ฒ ๊ฐ์ง๋ ์๋ค๊ณ ํ์ จ๋๋ฐ์, ํน์ ์์ ๊ฐ์ ๊ฒฝ์ฐ ๋์ข์ ํ๋ ์์ํฌ๊ฐ ์์๊น์?
- 0
- 3
- 294
Q&A
DispatchGroup ๊ด๋ จ ์ง๋ฌธ
๋ฆ์์๋ฒฝ์๋ ๋ต๊ธ๋ฌ์์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ต๋ณ์ฃผ์ ๊ฑธ ๋ณด๋ ์์ฐจ์ถ์๋ค์... ์์ง๋ ๋ง์ด ๋ฐฐ์์ผ ํ๋๊ฒ ๊ฐ์ต๋๋ค ใ ์ ๊ฐ ์๋ชป์๊ณ ์๋๊ฑฐ ๊ฐ์ต๋๋ค. notify๊ฐ leave ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค๋ฉด 1. ์ด๋ค ํด๋ก์ ๋ด์ ์๊ฑด ๊ฐ์ ํธ์ถ์ด ๋๋ ๋ ์์ด๋ผ๊ณ ์๊ฐ์ ํ์ต๋๋ค. ๊ฐ์ ๋งฅ๋ฝ์ผ๋ก if ํด๋ก์ ๋ด๋ถ์์๋ leave ๋ฅผ ๋ง๋๋ฉด ์คํ์ด ๋๋ค๊ณ ์๊ฐ์ ํ์ต๋๋ค. ์์ ์ฝ๋๋ฅผ ๋ค์๋ณด๋ 1๋ฒ์ด ๋๋ค๊ณ ์ฐฉ๊ฐ์ ํ์๋ค์. 1๋ฒ์ด ๋๋ ๊ฒ์ด ์๋๋ผ testFunc()/true ๋ด๋ถ์ start(), notify()๊ฐ ์์ด์ notify๊ฐ ๋ค์ ํธ์ถ๋ ์ ์์๋๊ฑฐ์๋ค์ ใ ๋น์ฐํ boolean์ด false์ด๋๋ leave๊ฐ ํธ์ถ๋์ด๋ notify๋ฅผ ๋ฑ๋ก(?)ํ์ง ์์๊ธฐ์ ํธ์ถ์ด ์๋๋ ๊ฒ์ด์๊ณ ์... notify()๋ผ๋ ๋ก์งํ๋ฆ๋ง ๋ฐ๋ผ๊ฐ๋ค๋ณด๋ ์ ์ ์ค์ํ ๊ฒ์ ๊น๋จน๊ณ ์์์ต๋๋ค. ๋ถ๋๋ฝ๋ค์... ๋ค์์๋ ์ง๋ฌธ ์ฌ๋ฆด๋ ์ ์คํ ์ฌ๋ฆฌ๋๋กํ๊ฒ ์ต๋๋ค. ์ด๋ฐ ์ง๋ฌธ์๋ ๋ต๋ณ์ ๋ฌ์์ฃผ์๋ ๋๋ฌด ๊ฐ์ฌํ ๋ฐ๋ฆ์ ๋๋ค ใ ์ข์ ๋ฐค๋์ธ์!
- 1
- 6
- 328
Q&A
DispatchGroup ๊ด๋ จ ์ง๋ฌธ
ํญ์์น์ ํ ๋ต๋ณ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ใ ใ ๋ง์ํ์ ๋๋ก url request๋ฅผ ์ด์ฉํด์ ์์ฑ์ ํด๋ดค๊ณ , request์์ ์๋ delegate ํจํด์ ์์ฃผ์ฌ์ฉํ๋ ๊ทธ๊ฒ๋ ํจ๊ป ์์ฑํด๋ดค์ต๋๋ค. View๋ถ๋ถ์ ๊ทธ๋๋ก์ด๊ณ ๋ฌธ์ ๊ฐ ๋๋ ํ์ผ๋ง ์์ ํด์ ์ฌ๋ ค๋๋ฆฝ๋๋ค. import Foundation let pGroup = DispatchGroup() let pThread = DispatchQueue.init(label: "com.test", qos: .default) class GCDTest{ init() { } //task1 func start(){ pGroup.enter() Req(delegate: self).request() } //task4 func testFunc(boolean: Bool){ print("testFunc") if boolean{ self.start() pGroup.notify(queue: pThread) { print("notify") } }else{ print("else") } } } extension GCDTest: ReqDelegate{ func response() { print("response") //task3 pThread.async { print("pThread async") pGroup.leave() } } } protocol ReqDelegate { func response() } class Req{ var delegate: ReqDelegate! init(delegate: ReqDelegate) { self.delegate = delegate } //task2 func request() { // https://httpbin.org/#/Images/get_image let url: URL = URL(string: "https://httpbin.org/#/Images/get_image")! let request = URLRequest(url: url) let session = URLSession.shared session.dataTask(with: request) { (data, response, error) in if error != nil{ return }else{ self.delegate.response() } }.resume() } } ์คํ ๊ฒฐ๊ณผ๋ ์ฒ์ ์์์์๋ (์ฌ์ง) boolean = true ๋ฒํผ ํด๋ฆญ์ (์ฌ์ง) boolean = false ๋ฒํผ ํด๋ฆญ์ (์ฌ์ง) ์ด๋ ๊ฒ ์ถ๋ ฅ์ด ๋ฉ๋๋ค. ์ ๊ฐ ์์ํ๋ Flow๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. (์ฌ์ง) ํ์ฌ testFunc()๋ฉ์๋์ boolean ๊ฐ์ ๋ฐ๋ผ์ notify๊ฐ ์คํ๋๊ณ ์๋๋ ์ค์ ๋๋ค. notify()๊ฐ leave() ๊ฐ ํธ์ถ๋๊ณ ๋๋ฉด ๋ฐ๋์ ์คํ๋์ด์ง๋ ๋ฉ์๋๋ผ๊ณ ์๊ฐ์ ํ๋๋ฐ ์์๊ฐ์ ์ฝ๋๋ฅผ ๋ณด๋ ํผ๋์ด ์์ต๋๋ค. notify()๋ฅผ ๊ฐ์ธ๊ณ ์๋ ๋ธ๋ญ๋ค(testFunc(), if boolean)์ ๋ฐ๋ผ์ notify()๊ฐ ์คํ๋๊ณ ์๋๊ณ ๊ฐ ๊ฒฐ์ ๋๊ณ ์๋ ์ํฉ์ธ๊ฒ๊ฐ์ต๋๋ค. ์ด์๊ฐ์ ์คํ๊ฒฐ๊ณผ๊ฐ ์ด๋ป๊ฒ ๋์ค๋์ง๊ฐ ๊ถ๊ธํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
- 1
- 6
- 328
Q&A
GCD - 7.(์ฌํ) Thread-safeํ ์ฝ๋์ ๊ตฌํ๊ณผ ๋ฐฉ๋ฒ / 2)์๋ฆฌ์ผํ์ Sync ์์ ์ง๋ฌธ์ ๋๋ค.
๊ฐ์ฌํฉ๋๋ค ใ ใ ๊ฐ์์ ์ฌ๋ ค์ฃผ์ ์ฝ๋๋ฅผ ๋ค์ํ๋ฒ ๋ณด๋ ์ด์ ์ ๋ง ์๋ฒฝํ๊ฒ ์ดํดํ์ต๋๋ค ใ ใ ๋ฆ์ ์๊ฐ์์๋ ๋ถ๊ตฌํ๊ณ ๋ต๋ณ๋ฌ์์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ๋๋ถ์ ํญ์ ๋ง์ด ๋ฐฐ์๊ฐ๋๋ค. ์ฆ๊ฑฐ์ด ์ฃผ๋ง๋ณด๋ด์ธ์! :)
- 1
- 7
- 668
Q&A
GCD - 7.(์ฌํ) Thread-safeํ ์ฝ๋์ ๊ตฌํ๊ณผ ๋ฐฉ๋ฒ / 2)์๋ฆฌ์ผํ์ Sync ์์ ์ง๋ฌธ์ ๋๋ค.
์ ๊ฐ ์์ ์ ๋๋ฌ์ ๋ต๋ณ์ด ๊ผฌ์ธ ๊ฒ ๊ฐ๋ค์ ใ ์ฃ์กํฉ๋๋ค. ๋ค์ ์ง๋ฌธ์ ๋๋ฆฌ๊ฒ ์ต๋๋ค ใ ใ ํ๊ฐ์ง ๊ถ๊ธํ๊ฑด [์ฝ๊ธฐ + ์ฝ๊ธฐ + ์ฐ๊ธฐ + ์ฐ๊ธฐ + ์ฝ๊ธฐ + ์ฐ๊ธฐ] ์ด๋ฐ ์์ผ๋ก ๋ค์ฃฝ๋ฐ์ฃฝ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ๋ํํฉ๋๋ค. ๋ผ๊ณ ๋ต๋ณ๋ฌ์์ฃผ์ จ๋๋ฐ count๋ถ๋ถ์ async๋ก ์ ๊ทผํ์ง๋ง( DispatchQueue.global().async{ } ) count ์์ฒด๋ SerialQueue.sync{} ๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ ์์๋ฅผ ๋ณด์ฅํ ์ ์๋ค๋ผ๊ณ ์ ๋ ์ดํดํ๋๋ฐ ํ๋ฆฐ ๋ถ๋ถ์ด ์์๊น์? ์ฆ, ๋ค์๋งํด [task2(์ฝ๊ธฐ + ์ฐ๊ธฐ) + task3(์ฝ๊ธฐ + ์ฐ๊ธฐ) + task1(์ฝ๊ธฐ + ์ฐ๊ธฐ)] ์ด๋ฐ์์ผ๋ก task ์์ฒด๋ async๋ก ๋ค์ฃฝ๋ฐ์ฃฝ์ด์ง๋ง ์ฝ๊ธฐ ์ฐ๊ธฐ ์์ ์ serialQueue์์ sync๋ก ๋์ํ๋ ๊ฒ์ ์ดํดํ๊ณ ์์์ต๋๋ค! ํญ์ ๋น ๋ฅด๊ณ ์น์ ํ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค!
- 1
- 7
- 668
Q&A
GCD - 7.(์ฌํ) Thread-safeํ ์ฝ๋์ ๊ตฌํ๊ณผ ๋ฐฉ๋ฒ / 2)์๋ฆฌ์ผํ์ Sync ์์ ์ง๋ฌธ์ ๋๋ค.
๋น ๋ฅด๊ณ ์น์ ํ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค! ์ค๋๋ง์ ๊ฐ์๋ฅผ ๋ค์ด์ ๊ธฐ์ด๋ถ๋ถ์ ๊น๋นกํ๋๋ฐ ๋ค์ํ๋ฒ ์ง์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ใ ใ ํ๊ฐ์ง ๊ถ๊ธํ๊ฑด [์ฝ๊ธฐ + ์ฝ๊ธฐ + ์ฐ๊ธฐ + ์ฐ๊ธฐ + ์ฝ๊ธฐ + ์ฐ๊ธฐ] ์ด๋ฐ ์์ผ๋ก ๋ค์ฃฝ๋ฐ์ฃฝ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ๋ํํฉ๋๋ค. ๋ผ๊ณ ๋ต๋ณ๋ฌ์์ฃผ์ จ๋๋ฐ count๋ถ๋ถ์ async๋ก ์ ๊ทผํ์ง๋ง( DispatchQueue.global().async{ } ) count ์์ฒด๋ SerialQueue.sync{} ๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ ์์๋ฅผ ๋ณด์ฅํ ์ ์๋ค๋ผ๊ณ ์ ๋ ์ดํดํ๋๋ฐ ํ๋ฆฐ ๋ถ๋ถ์ด ์์๊น์? ์ฆ, ๋ค์๋งํด [task2(์ฝ๊ธฐ + ์ฐ๊ธฐ) + task3(์ฝ๊ธฐ + ์ฐ๊ธฐ) + task1(์ฝ๊ธฐ + ์ฐ๊ธฐ)] ์ด๋ฐ์์ผ๋ก task ์์ฒด๋ async๋ก ๋ค์ฃฝ๋ฐ์ฃฝ์ด์ง๋ง ์ฝ๊ธฐ ์ฐ๊ธฐ ์์ ์ serialQueue์์ sync๋ก ๋์ํ๋ ๊ฒ์ ์ดํดํ๊ณ ์์์ต๋๋ค! ํญ์ ๋น ๋ฅด๊ณ ์น์ ํ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค!
- 1
- 7
- 668
Q&A
GCD - 3.๋์คํจ์นํ(GCD) ์ฌ์ฉ์ ์ฃผ์ํด์ผํ ์ฌํญ ๊ฐ์์์ ์ง๋ฌธ์ ๋๋ค.
์ ๊ฐ์ฌํฉ๋๋ค ใ ใ ๊ฐ์๋ฅผ ๋ฃ๋ค๊ฐ ๋ฌด์กฐ๊ฑด ์ ์ผ๋ก ๋ฐ๋๋ฝ์ด ๋ฐ์ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ธํ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค ใ ใ ๋ช ํํ ์ดํด๋์์ด์!
- 2
- 3
- 261




