55,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
예제 프로젝트 빌드 실패
예제 프로젝트를 실행할 수가 없습니다.애플 developer 계정을 반드시 만들어야 하나요? 아직 초보라서 좀 익숙해지면 하려고 했는데...
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
serial 큐 질문드립니다.
안녕하세요. 기본 구조는 A 스레드에서 SQ라는 serial queue에 async하게 task를 합니다.전달한 task의 마지막 부분에 @escaping 하는 completionHandler()를 호출하는 구조입니다. 만약 A 스레드에서 SQ에 task1, task2 두개를 보내면 completionHandler가 호출되는 순서는 보장받을 수 없는거죠? task1 { serialqueue.async { ...... completionHandler() } } task2 { serialqueue.async { ...... completionHandler() } }
- 해결됨iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
[7-3.DispatchBarrier] 예제 코드 질문
아래 예제 코드에서 "threadSafeNameGroup.notify" 가 정상적으로 동작하려면, 그룹의 enter와 leave 를 사용해주어야 하는 것이 아닌가? 라는 생각이 들었습니다.왜냐하면 "barrierThreadSafePerson.changeName" 메소드가 async로 작업을 보내기 때문입니다. 그럼에도 정상적으로 동작하는 이유는 barrier 플래그를 설정했기 때문에, 현재 쓰레드를 블락처리 했기 때문에 정상적으로 동작했는 것이 아닌가하는 추측을 하고 있습니다. 왜 enter 와 leave가 사용이 되지 않았는지 궁금합니다.
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
안녕하세요, GCD 관련 질문드립니다..
안녕하세요, 앨런, Qos 부분을 수강하면서수업 자료에 있던 코드들을 이렇게 바꾸어서 실행해보았는데요...첫줄은 sync 라서 시작/완료까지 실행하고 task2, task4(비동기라서 완료까지 안 찍고 넘어가고), 그리고 task3 시작/완료 라고 이해를 했습니다. 제가 예상한 결과였고, 그렇게 출력이 되었어요. 근데 동일한 코드를 반복적으로 실행하면 그때마다 다른 결과가 나오는데.. 왜 그런지 모르겠어서 질문 남깁니다.. ㅠㅠ 어쩔때는 4가 먼저 실행되고어쩔때는 3이 먼저 실행되더라구요..왜 그렇게 순서가 바뀌는지가 가장 궁금하고..qos를 통해서 우선순위를 설정한다는 의미가 언제 어떻게 우선순위대로 실행되도록 한다는 것인지 이해를 못 한 것 같습니다...위 코드에서 userInteractiveQueue 가 defaultQueue.async(qos: .userInitiated)보다 우선순위가 높은 것이 실행을 먼저 하는 것은 아닌것 같은데.. 우선순위라는게 어떻게 반영이 되는것인지 감이 안 잡힙니다 ㅠㅠ 아니면 제가 쓸데없는 코드를 보면서 고민한건지.. 답변부탁드려요!!
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
main.async 작동 질문(+ vs global(),async)
안녕하세요!main.async 작동 관련하여 궁금한점이 있어 질문드립니다.대게, 네트워킹 작업과 같은 부분은 global().async로 메인쓰레드가 아닌 다른 쓰레드로 작업을 보내서 백그라운드에서 돌게 하는데, 어떻게 보면 작동하는 앱(프로세스)별로 메인 쓰레드는 하나일텐데, main.async는 어떻게 작동하는지 잘 모르겠어요.제가 이해하고 있는 부분이 맞는지도 헷갈리네요ㅠ1) 메인 쓰레드에서 서브 쓰레드로 이미지 다운로드 태스킹 보냄2) 이미지 다운로드가 끝나고 컴플리션 핸들러 실행3) main.async로 다운로드 받은 이미지로 뷰 업데이트1)~3) 과정이 대략 비동기를 활용하는 과정인데, 3)에서 main.async로 메인 쓰레드로 작업을 보냈을 때머릿속에서 도식화가 잘 안되는 것 같습니다.어느 부분 강의를 보면 좋을지 답변 부탁드립니다. 감사합니다!
- 해결됨iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
dismiss 되었을 때 종료질문
섹션 3 - 1에서weak self 로 전달된 클로저는 뷰 컨트롤러가 dismiss되었을 때 클로저의 작업들이 뷰 컨트롤러 객체 안에 속해있기 때문에, 클로저의 작업도 함께 종료된다고 하셨는데.섹션 3 - 2 에서 보여주신 weak self 예제에서는 뷰 컨트롤러가 소멸되었음에도 클로저의 작업이 계속 진행되더라고요. 왜 다른 결과가 나오는지 궁금합니다.
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
'동기'와 '동시성 프로그래밍'에 대해 질문드립니다.
안녕하세요 앨런(Allen)님!수강 중 질문이 생겨 처음 인사드립니다.[섹션0.GCD - 1.GCD/Operation에 앞서] 강의까지 듣고 동기(Sync)는 동시성 프로그래밍(Concurreny Programming)이 아닌 건지 질문드립니다.-2개 이상의 프로세스가 동시에 작업하는 것이 ‘동시성 프로그래밍(Concurreny Programming)’이고 IOS에서 이러한 동시성 프로그래밍을 사용하기 위해 작업을 대기행렬(Queue)에 보내며, 대기행렬(Queue)은 직렬(Serial)과 동시(Concurrency)이라는 특성을 가지고 있다고 이해했습니다.이 과정에서 동기(Sync)는 작업을 다른 스레드(Thread)에서 하도록 시킨 후, 기다렸다가 다음 일을 진행한다고 설명해 주셨는데 그렇다면 동기(Sync)는 동시성 프로그래밍(Concurreny Programming)이 아닌 건지 확실하게 확인하고 넘어가면 좋을 것 같아 질문을 드리게 되었습니다.추가로 대기행렬(Queue)의 특성 중 직렬(Serial)은 작업을 분산시킨 *메인 스레드(Thread)가 있기 때문에 동시성 프로그래밍(Concurreny Programming)으로 볼 수 있다고 이해했는데 이해한 내용이 맞는지도 함께 답변 주시면 큰 도움이 될 것 같습니다.*강의 영상에서 말하는 Thread1을 작성한 것입니다.-혹시 제가 잘못 이해한 부분이 있으면 함께 답변 남겨주시면 감사하겠습니다 :)
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
Dependency Protocol 관련
// (2) 이미지 변형하는 오퍼레이션 (동기 함수) class TiltShiftOperation: Operation { var inputImage: UIImage? var outputImage: UIImage? override func main() { // 🔸🔸🔸 2) 프로토콜 채택한 앞의 오퍼레이션에서, 인풋값을 얻어내기 if inputImage == .none, // 인풋이미지가 없으면, let dependencyImageProvider = dependencies .filter({ $0 is ImageLoadOperation }) .first as? ImageLoadOperation { // (의존하고 있는) 오퍼레이션의 배열에서 오퍼레이션 꺼내기 inputImage = dependencyImageProvider.outputImage } // 실제 작업 outputImage = tiltShift(image: inputImage) } } 안녕하세요. 좋은 강의 잘 듣고있습니다. 감사합니다. 강의 중 궁금증이 생겼는데, 위 코드 처럼 protocol을 사용하지 않고 직접 class을 확인하는 방법은 어떤문제 점을 야기하길래 protocol을 사용하는 것일까요? 아니면 위와 같은 방법은 크게 문제가 되지 않는다면 위와 같은 방법을 활용해도 될까요??
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
시리얼 큐와 sync 관련
private let threadSafeCountQueue = DispatchQueue(label: " ") private var _count = 0 public var count: Int { get { return threadSafeCountQueue.sync { _count } } set { threadSafeCountQueue.sync { _count = newValue } } } for _ in 0..<30000 { DispatchQueue.global().async { count += 1 } } Thread.sleep(forTimeInterval: 15) print(count)앨런님의 설명처럼 count를 싱크처리 하고 async로 count를 증가시키는데 정상적인 값이 안나옵니다. 어떻게 하면 될까요?
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
sync이지만 Queue에 넣으면 async로 동작한다는 말의 의미
안녕하세요 앨런님!오퍼레이션큐 강의를 듣다가 혼동되는 개념이 있어서 질문합니다큐의 종류를 정리하실 때 크게 GCD와 OperationQueue로 나누는걸로 보입니다.그렇다면 Operation은 OperationQueue에서 다루는 작업의 단위로 이해가 되는데, GCD에서는 작업의 단위가 무엇인가요? 또, Operation.start()는 동기적으로 동작하지만,OperationQueue.add(operation)을 하면 operation이 비동기적으로 동작한다고 하셨는데이 말은 Operation이 Queue에 들어가지 않고도 수행될 수 있다는 말인가요??그렇다면 GCD에서 사용하는 작업의 단위도 DispatchQueue에 들어가지 않고 작업을 수행할 수 있나요?? 아직 개념이 머릿속에 정리되지 않아 질문 자체도 혼동 스럽지만 답변 부탁드리겠습니다..ㅎㅎ
- 해결됨iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
lazy var 이슈로 생긴 여러 변수들은 어디에 있나요?
강의에서 보면 경쟁상황에 의해 testVar 변수가 여러개 생긴 상황이 발생하는 것으로 보입니다!그렇다면, 예를들어 강의 4:22에서 들어준 예시와 같이 testVar 변수가 세개 생겼다고 가정하고 이를 a,b,c 라고 이름 붙이고, a,b,c 순서로 변수가 생성되었다고 할 때 궁금한 점이 있습니다.Q. 최종적으로 인스턴스가 가지게 되는 프로퍼티는 c인가요?-> 맞다면 나머지 a,b는 어디에 저장되는 것인지, 인스턴스가 메모리에서 해제되면 a,b는 해제되지 않을것 같은데 좀비로 남게 되나요??-> 아니라면 a,b,c 중에 어떤 변수가 최종적으로 프로퍼티로써의 역할을 할 수 있나요?
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
global큐에 sync로 작업을 보냈을 때는 터지지 않는 이유가 궁금합니다.
안녕하세요.강의 잘 듣고 있습니다!sync를 공부하다가 의문이 생겨서 질문 남깁니다.메인스레드에서 메인큐로 sync로 작업을 보내면ui를 보여줘야할 메인에서 작업을 한없이 기다리게 되니 크래시가 난다고 알고 있습니다.강의에서, 메인에서 글로벌큐로 sync로 작업을 보내더라도 실질적으로는 메인에서 작업을 한다고 하셨는데요.그렇다면 실질적으로는 메인에서 sync로 작업을 하는 것과 다를 바가 없는데, 그런 경우에는 왜 크래시가 발생하지 않는 건가요?
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
비동기 개념에서 무엇을 return하는 거죠??
비동기 개념에서 즉시 리턴 한다고 하셨는데 무엇을 리턴하는지 궁금합니다!
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
안녕하세욤
안녕하세요. 몇 달 전부터 동기/비동기 개념에 관해 틈틈히 짤막하게 찾아보고 (물론 이해는 안가네요🥲) 나름대로 의미를 정립해봤어요. 강의를 듣기 전에 생각을 정리해보고자 질문드립니다. 그러면 강의 듣는 데 더 도움이 되리라 생각해서요. Swift에서 비동기 개념에서 여러 가지 방법이 존재하는 걸로 보이는데, 무슨 차이가 있는 건가요? 🥺① DispatchQueue② async/await③ CompletionHandler-Callback 🤔 개념은 같아 보이는데, 단순히 버전 차이인가요? 특히 (3)의 방법이 너무 어렵고 복잡해서 (2)의 방법이 새로 나왔다고 알고 있는데, 셋 모두 비슷한 맥락인가요?
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
Barrier 작업 관련 질문입니다.
안녕하세요! 본강의 Barrier파트를 듣고 직접 구현을 해보았을때, 모르는 부분이 생겨 질문을 드립니다. barrier 작업들을 DispatchGroup으로 묶었을 경우Tsan을 체크하고 빌드하는 경우 Thread-Safe하지 않는 부분이 감지되었습니다.반면, 똑같은 barrier 작업을 DispatchGroup으로 묶지않는 경우는Tsan에 감지되지 않는데, 이런 결과가 나오는 이유를 모르겠어서 질문드립니다!// Tsan에 감지되는 코드(DispatchGroup) for i in 1...5 { print("--- \(i)번째 ---") let group = DispatchGroup() var someNumber = 10 DispatchQueue.global().async(group: group, flags: .barrier) { sleep(1) someNumber *= 10 // Race Condition 감지되는 부분 print("after multiple 10 : \(someNumber)") } DispatchQueue.global().async(group: group, flags: .barrier) { sleep(1) someNumber += 1 // Race Condition 감지되는 부분 print("after add 1 : \(someNumber)") } group.notify(queue: .main) { print("\(i)번째 결과 : \(someNumber)") } group.wait() }// Tsan에 감지되지 않는 코드(DispatchGroup X) for i in 1...5 { print("--- \(i)번째 ---") var someNumber = 10 DispatchQueue.global().async(flags: .barrier) { sleep(1) someNumber *= 10 print("after multiple 10 : \(someNumber)") } DispatchQueue.global().async(flags: .barrier) { sleep(1) someNumber += 1 print("after add 1 : \(someNumber)") } }
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
디스패치 그룹
안녕하세요. 디스패치 그룹 강의를 보았습니다.그룹1을 만들어DispatchQueue.global.aysnc를 실행 시키면서 그룹1에 넣고notify가 그룹의 종료를 알려준다고 하시는데, 만약 for문으로 10개를 생성하는 상황에 6번째를 생성하기전에 5번째까지 동작이 모두 끝나버린다면 notify가 실행되고 다음 6번째부터 새로 그룹에 들어가는건가요??
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
global async안에 global async를 만들게되면 어떻게 되나요??
강의를 보고 global async를 알았습니다. 이게 작업을 큐에 넣어준다고 하셨는데, global async 클로저 안에 global async를 넣으면 어떻게 되는건가요??
- 해결됨iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
동기적 함수를 비동기적 함수로 바꾸는 부분에서 질문 있습니다
func asyncTiltShift(_ inputImage: UIImage?, runQueue: DispatchQueue, completionQueue: DispatchQueue, completion: @escaping (UIImage?, Error?) -> ()) { runQueue.async { var error: Error? error = .none let outputImage = tiltShift(image: inputImage) completionQueue.async { completion(outputImage, error) } } }runQueue는 이미 비동기로 돌아가고 있는데 굳이 completionQueue에서 다시 한번 더 비동기로 돌아가게 만드는 이유가 무엇인가요? 강의 너무 잘 듣고 있습니다 :)
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
비동기오퍼레이션 관련 질문
안녕하세요! 강의 수강 중 궁금한 점이 있어 질문 드립니다.비동기오퍼레이션에서 상태변화가 생길 때, willSet과 didSet이 호출되는데, 이 쪽 구현부분에 있어서 의문점이 있습니다. willChangeValue(forKey:)함수와 didChangeValue(forKey:) 함수가 왜 두 번씩 불리는지 알고 싶습니다.var state = State.ready { willSet { willChangeValue(forKey: newValue.keyPath) willChangeValue(forKey: state.keyPath) } didSet { didChangeValue(forKey: oldValue.keyPath) didChangeValue(forKey: state.keyPath) } } willChangeValue(forKey:) 메서드의 정의를 찾아보니 '값이 바뀔 프로퍼티의 값을 관찰하고 있는 객체에 알리는 역할'이라고 되어 있더라구요 (Informs the observed object that the value of a given property is about to change.) 그래서 oldValue에 대해서도 실행해주는 것이 잘 이해가 가지 않습니다. 혹시 추가 설명 부탁드려도 될까요?그리고 위의 코드를 어떻게 비동기오퍼레이션을 이용해서 callback 지옥으로부터 벗어날 수 있는지 알려주시면 감사하겠습니다! 항상 강의 잘 보고 있습니다! 친절한 설명 덕분에 점점 동시성에 대한 갈피가 잡히는 것 같아요.감사합니다 !! :)
- 미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
강의자료는 어디에 있나요?
강의자료(소스파일)는 어디에 있나요?