55,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
4강 관련 질문있습니다!
안녕하세요 앨런님! 오랜만에 4강을 듣다가 궁금한점이 이것저것 생겨 질문 남깁니다! 1. Qos 에서 User interactive랑 initiated의 차이가 명확히 와닿지 않아서요 ㅜㅜ initiated쪽에서 “비동기적으로 처리된 작업”이라는 설명이 있는데 그럼 전자는 동기적으로 처리된 작업인가요? 2. 강의 자료 (88페이지)에서 “iOS가 알아서 우선적으로 중요한 일임을 인지하고 쓰레드에 우선순위를 매겨 더 여러개의 쓰레드를 배치하고 배터리를 더 집중해서 사용 하도록 함” 이라고 써있는데 쓰레드에 우선순위를 매긴다는게 무슨 뜻일까요?? 큐에 우선 순위를 매겨 더 많은 스레드를 배치하는 것 아니었나요? 스레드 자체에도 순위가 있는건가요??? 3. task의 qos(async로 보낼때 지정하는 qos)가 utility이고 queue의 qos 가 더 낮은 상황(.background)에서는 task qos의 영향을 받아 queue의 품질이 utility로 상승하게 된다. 라고 말씀 주셨는데 global(qos: .background)큐가 utility 자체로 바뀐다는건지(그럼 background queue는 없어지는건가여..???ㅎ 이건 아닐거 같긴 한데..), 해당 task만 qos: utility인 큐로 간다는건지,, 설명 부탁드려도 될까요? 4. 만약 task의 qos가 큐의 품질보다 더 낮은 상황에서는 어떻게 되나요? 감사합니다 :)
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
3강 async 관련 질문입니다.
안녕하세요! 강의 감사하게 잘 듣고있습니다. 다름이 아니라 3강에서 async를 설명하실때 "작업을 보내고 즉시 리턴" 이라고 설명해주셨는데, "보낸다"의 시점이 작업을 queue에 보낼때일까요 아니면 queue 에서 작업이 GCD에 의해 다른 스레드에 할당 될 때 일까요?? 그림을 봐도 헷갈려서 질문 드립니다! 감사합니다 :)
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
4강에서요
Serial 큐는 특정 하나의 스레드에서만 처리한다고 설명해주셨는데 제가 찾아보니 어떤 글에서는 특정 하나의 스레드가 아니라 한번에 하나의 스레드라고 하네요. 링크: https://stackoverflow.com/questions/51057441/serial-dispatch-queue-will-use-only-one-thread ,,,그래서 Serial 큐는 특정 하나의 스레드에서 처리하는게 맞는건가요?
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
3강에서요
초반에 동기/비동기 설명하신 부분, 동기/비동기가 아니라 블록/논블록을 설명해주시고 있는 거 아닌가요? 아니 동기/ 비동기 랑 블록/ 논블록을 혼합해서 설명하시는 것 같은데 동기/비동기 , 블록/논블록 구분해서 설명 부탁드립니당
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
completion closure안에 @escaping 질문입니다
escaping에 해당하는 closure가 작동하려면 runQueue와 completionQueue설정이 되어 있어야만 하나요?
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
OperationQueue 압축 프로젝트
OperationQueue 압축 프로젝트를 응용해서 깃헙에 정리하고 싶은데 사용해도 괜찮을까요?
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
Dispatch Source
매번 최적화에 관심이 많아 자료를 찾아봐도 명확하게 알 수 없었던 부분을 이해시켜주셔서 매우 감동입니다 :) 다름이 아니라 궁금한 점이 생겨 질문남깁니다. 파일의 변화를 다루는? Dispatch Source도 있는걸로 알고 있는데 어떠한 상황에서 사용되는지 궁금합니다. 혹시 스트리밍 프로토콜인 hls를 사용할때 m3u8 파일에 변화(네트워크 환경에 따른 영상 퀄리티)를 감지해서 처리할 수 있는것도 하나의 사용법인가요? 아니라면 hls 최적화를 하는 작업으로는 어떤것들이 있는지 알고싶습니다. 감사합니다 :)
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
통신을 그룹으로 묶어서 for문 돌리는 부분 질문이요!
* 반복적으로 비동기 함수들을 for문을 통해 실행을 시킬 때, completion부분에서 downloadedImages 배열에 append 시키는 부분이 있는데, downloadedImages배열 접근 시점이 비슷해도 append 메소드는 상관이 없이 다 더해지나요?
- 해결됨iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
DispatchGroup 관련 질문
안녕하세요 강사님 오랜만에 인사드립니다! 요즘 컨커런시 관련해서 예제코드도 작성해보고 나름 코드로 이리저리 놀던(?) 도중 신기한 상황이 발생되어서 질문드립니다. SiwftUI로 작성되었으며 View부분은 아래와 같습니다. import SwiftUI struct ContentView: View { @ObservedObject var vm = ViewModel() var body: some View { VStack{ Button(action: { self.vm.gcdTest.testFunc(boolean: true) }){ Text("boolean = true") } Button(action: { self.vm.gcdTest.testFunc(boolean: false) }){ Text("boolean = false") } } } } class ViewModel: ObservableObject{ let gcdTest = GCDTest() init() { self.gcdTest.start() } } 실제로 문제가 되는 부분은 아래와 같습니다. import Foundation let pGroup = DispatchGroup() let pThread = DispatchQueue.init(label: "com.test", qos: .default) class GCDTest{ init() { } func start(){ pGroup.enter() pThread.async { print("pThread async") pGroup.leave() } } func testFunc(boolean: Bool){ if boolean{ self.start() pGroup.notify(queue: pThread) { print("notify") } }else{ print("else") } } } 여기서 신기했던 점은 testFunc(boolean:) 메서드의 로직이 실행되지 않았을 때는 pGroup.leave() 가 호출이 되어도 notify()가 실행이 되지 않는다는 것입니다. 제가 상상하고 있던(예상하고 있던) 로직의 진행은 아래와 같은데 말이죠... 혹시 이와 관련해서 피드백이나 개념을 알려주실수있을까요?
- 해결됨iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
GCD - 7.(심화) Thread-safe한 코드의 구현과 방법 / 2)시리얼큐와 Sync 에서 질문입니다.
안녕하세요 강사님! 해당 강좌를 듣다가 제가 이해한 것이 맞는지 궁금해서 질문드립니다. 제가 이해한 내용을 아래와 같이 정리해봤는데 혹시 피드백을 주실 수 있을까요? 동시큐 등에서 접근할 가능성이 있는 객체 설계시 ViewController 부분(1차 호출 부) DispatchQueue.global().async{ count = count + 1 // task1 count = count + 2 // task2 count = count + 3 // task3} 객체 부분 private let serialQueue = DispatchQueue(label: "...")private var _count = 0public var count: Int{ get{ return serialQueue.sync{ // serial Queue에 넣었으면 됐지, 왜 또 async가 아닌 sync 일까? _count } } set{ serialQueue.sync{ _count = newValue } }} 위의 코드를 그림으로 표현하면 다음과 같은 형태가 됩니다. 뷰컨트롤러에서 concurrentQueue에서 async로 객체의 serialQueue로 async 로 접근하는 모습입니다. 이를 더 자세하게 표현하자면 아래와 같습니다. 1. Thread1 에서 Queue(DispatchQueue.global())에 task들이 들어간다. 각각의 task들은 async로 되어있기 때문엔 Thread1에서는 block 되는 작업 이없다. 2. 각각의 task들은 thread2, 3, 4 에 배정된다. 3. 각각의 task들은 SerialQueue에 들어가게 되는데 이는 sync 메서드를 사용했기 때문에 block 처리되어서 serialQueue에 들어가게 된다. 4. SerialQueue에서 순서대로 Thread5에 배정되어 task가 처리된다. 5. 예상되는 count값은 6 이다. 감사합니다.
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
GCD - 3.디스패치큐(GCD) 사용시 주의해야할 사항 교착 상태에 관한 질문입니다.
안녕하세요 그래프로 큐-스레드 간 관계를 보기 좋게 정리해주셔서 직관적이고 이해하기 쉬워서 감사드리면서 수강하고 있습니다. 위 강의에서 설명해주신 교착 상태와 관련하여 질문이 있습니다.강의 내용 내에서 play ground 교착 상태 예제 코드의 주석중 "본 예제는 작업시간이 워낙 짧기 때문에 실제 Deadlock(교착상황)이 안생길수 있다" 는 말씀이 이해가 잘 가지 않습니다.결국 이 문장이 의미하는 바를 풀어쓴다고 한다면, "구조적으로는 교착상황임에도 불구하고, task의 수행 시간이 매우 짧아 실제로 교착 상황이 발생하지 않는다" 인것이 맞을까요? 만약에 그렇다고 한다면 아래 2가지의 궁금증이 생깁니다. 1. 제가 기존에 알고 있던 '교착 상황 '의 정의와 다릅니다. 제가 교착상태의 정의에 관하여 알고있는 바로는 각 스레드 및 프로세스간의 작업 시간 길이와는 상관없이, 각 스레드 및 프로세스가 자신의 task를 수행하기 위해서 서로 상대의 자원이 필요한 상황에빠져, 서로의 각자의 task 수행 자체가 불가능한 '무기한 연기' 상황에 처하는 것으로 알고 있습니다.한 작업이 "상대의 작업이 끝나기를 기다리는 상황"이 아닌 "자신의 task 수행을 위해 서로가 상대의 자원을 요구하는 상황으로 무기한으로 task 수행 자체를 하지 못하는 상황" 으로 알고 있는데, 그렇다고 한다면 이는 스레드가 수행하는 task의 작업 시간이 짧은 것과는 어떤 연관이 있는 것인지 질문드립니다. 제가 교착 상황에 대한 정의를 잘못 이해하고 있는 부분이라면 교착 상황에 대해서 설명해주시면 감사드리겠습니다. 2. 1의 의문에 근거하여 생긴 추가 의문 1의 의문에 의해 강의에서 보여주신 예제 코드가 교착 상태가 아니라는 가정을 깔고 생각할 경우, DispatchQueue.global().async { var name: String { return DisaptchQeue.global().sync { "\(firstName)\(lastName)" } } } 예제에서 언급해주신 위 형태의 코드는 단지 처음에 async 지정해주었던 task를 바로 다시 sync 로 지정해주는 것에 그치는 것이 아닌가(상대의 작업이 끝나기를 기다리는 상황) 라는 생각이 드는데요1번 질문에 대한 답변이 된다면 2번 질문에 대한 답변은 저절로 될 것 같아 1번 질문만 답변 해주셔도 될 것 같습니다. 긴 질문글 읽어주셔서 감사합니다. 강의 재밌게 잘 듣고 있습니다.
- 해결됨iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
GCD - 3.디스패치큐(GCD) 사용시 주의해야할 사항 강의에서 질문입니다.
2) 현재의 큐에서 현재의 큐로 동기적으로 보내서는 안된다 라고 말씀해주셨습니다. 그 이유가Q.async{ Q.sync{ task1 } } 에서 그림과 같이 설명하신 부분에 thread1(th1)에 있던 task1을 async로 th2에 보냈는데 다시 task1를 sync로 queue에보내면 th2는 block이되고 queue입장에서는 task1을 처리하기 위해 th2에 다시 접근하려고 하나 block이 되어 있는 상태라서 task1을 처리할 수 없는 상황이라고 설명을 해주셨습니다. 제가 생각하기에는 task1을 굳이 다시 th2가 아닌 비어있는 thread(th1, 3, 4 ... )에서 처리를 하면 되지 않을까요? 이경우 제가 잘못 이해하고 있는 개념이나 틀린 것이 있을까요?