묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
global큐에 sync로 작업을 보냈을 때는 터지지 않는 이유가 궁금합니다.
안녕하세요.강의 잘 듣고 있습니다!sync를 공부하다가 의문이 생겨서 질문 남깁니다.메인스레드에서 메인큐로 sync로 작업을 보내면ui를 보여줘야할 메인에서 작업을 한없이 기다리게 되니 크래시가 난다고 알고 있습니다.강의에서, 메인에서 글로벌큐로 sync로 작업을 보내더라도 실질적으로는 메인에서 작업을 한다고 하셨는데요.그렇다면 실질적으로는 메인에서 sync로 작업을 하는 것과 다를 바가 없는데, 그런 경우에는 왜 크래시가 발생하지 않는 건가요?
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
환율 강의 테이블뷰에서 데이터 관련 질문있습니다.
안녕하세요 강의진행하면서 궁금한게있어서 질문드립니다.저의 경우 처음 Picker 뷰에서 rates배열에 url로 데이터 파싱한 데이터를 Table탭에서 delegate패턴을 이용해서 가져오는식으로 데이터를 가져오려 했습니다.먼저 Picker코드입니다. // // ViewController.swift // Exchange Rate // // // import UIKit class PickerViewController: UIViewController { @IBOutlet weak var usdTextField: UITextField! @IBOutlet weak var selectedCurrency: UITextField! @IBOutlet weak var selectedCurrencyName: UILabel! @IBOutlet weak var currencyPicker: UIPickerView! var rates: [(String,Double)]? // table data delegate weak var delegate: tableDataDelegate? // picker row변화에 따른 observer property 계산 var selectedRow = 0 { didSet { selectedCurrencyName.text = rates?[selectedRow].0 selectedCurrency.text = calculateCurrency() } } func calculateCurrency() -> String { let selectedValue = rates?[selectedRow].1 ?? 0 let usdValue = Double(usdTextField.text ?? "") ?? 0 let resultValue = String(format: "%.2f", (selectedValue * usdValue)) return resultValue } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. self.navigationItem.title = "Currency Converter Picker" fetchJson() //picker 연결 currencyPicker.delegate = self currencyPicker.dataSource = self // textField delegate usdTextField.delegate = self // porotcol delegate } func fetchJson() { let urlString = "https://open.er-api.com/v6/latest/USD" guard let url = URL(string: urlString) else {return} // data task URLSession.shared.dataTask(with: url) { data, res, err in guard let data = data else {return} do { let currencyModel = try JSONDecoder().decode(CurrencyModel.self,from: data) // rates: [key:value] 형태 // let rates = currencyModel.rates?.map { [$0 : $1] } // let rates2 :[(String,Double)]? = currencyModel.rates?.sorted(by: { dic1, dic2 in // dic1.key < dic2.key // sorted같은걸하면 Dictionary.Element가되서 tuple로 바뀜 // }) self.rates = currencyModel.rates?.sorted{ $0.key<$1.key } // picker 새로고침해야 데이터 내용이 보임 DispatchQueue.main.async { self.currencyPicker.reloadAllComponents() } // get table data print("rate: ",self.rates!) self.delegate?.getData(data: self.rates! ) // print("currentModel",currencyModel) } catch { print(err!) } }.resume() } } extension PickerViewController:UIPickerViewDelegate,UIPickerViewDataSource { func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return rates?.count ?? 0 } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { let key = rates?[row].0 ?? "" let value = rates?[row].1.description ?? "" return key + " " + value } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { selectedRow = row } } extension PickerViewController:UITextFieldDelegate { func textFieldDidChangeSelection(_ textField: UITextField) { selectedCurrency.text = calculateCurrency() } } 저의 경우 DispatchQueue.main.async { self.currencyPicker.reloadAllComponents() } // get table data print("rate: ",self.rates!) self.delegate?.getData(data: self.rates! )여기서 rates가 전부불어와지면 delegate를 이용해서 해당데이터를 table뷰로 가져오려고 의도했습니다. table데이터입니다.// // ListViewController.swift // Exchange Rate // // import UIKit protocol tableDataDelegate:AnyObject { func getData(data:[(String,Double)]) } class ListViewController: UIViewController { // Data list var conData = [(String,Double)?]() @IBOutlet weak var udsLabel: UILabel! @IBOutlet weak var costTextField: UITextField! @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. self.navigationItem.title = "Currency Converter Table" self.udsLabel.text = "UDS" // table // tableView.delegate = self tableView.dataSource = self let sb = UIStoryboard(name: "Main", bundle: nil) guard let detailVC = sb.instantiateViewController(withIdentifier: "PickerViewController") as? PickerViewController else {return} detailVC.delegate = self tableView.rowHeight = 100 } } extension ListViewController:UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { print("cor: ",conData) return 10 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = self.tableView.dequeueReusableCell(withIdentifier: "MyTableViewCell") as! MyTableViewCell cell.currencyLabel.text = "good" cell.valueLabel.text = "allaal" return cell } } extension ListViewController: tableDataDelegate{ func getData(data: [(String,Double)]) { print("data: ",data) self.conData = data // print(self.conData) } } 여기서 delegate프로토콜을 만들고 Picker뷰에서 가져온 데이터를 conData라는 배열에 담아서 저는 담겨진 데이터를 이용해서 테이블뷰에 데이터를 뿌리는식으로 작업하려했는데 이런식으로 하니 프로토콜이 제대로 안되서인지 conData에 데이터가 담기지 않고 빈배열이 나옵니다.. 저의경우 table뷰에서 델리게이트를 사용한다고 위임하는 코드를 let sb = UIStoryboard(name: "Main", bundle: nil) guard let detailVC = sb.instantiateViewController(withIdentifier: "PickerViewController") as? PickerViewController else {return} detailVC.delegate = self이렇게 Main에있는 스토리보드를 가져와서 권환을 위임했는데 이게 틀린걸까요?어디가 잘못됐는지 잘모르겠습니다.. 답변 부탁드립니다!
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
환율 네트워크처리1 질문있습니다.
안녕하세요 강의 41:46분에pickerView 의 delegate중에서 didSelecRow에 관해서 궁금한게있는데 해당 delegate속성이 picker로인해 선택된 row를 반환해준다고 알고있습니다.궁금한게[ didSeleectRow가있는 delegate메서드를 사용하려면 저는 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { selectedRow = row } 여기 함수안에서 var selectedRow = 0 { didSet { selectedCurrencyName.text = rates?[selectedRow].0 selectedCurrency.text = calculateCurrency() } }위에 해당하는 코드를 작성해야 함수가 작동된다고 생각했는데 강사님 강의보니 그게아니더라구요 왜 그런건가요? 가만생각해보니 didSelecRow에서 현재 선택된 row정보만 얻기위한 용도로 pickerView didSelectRow 델리게이트 메서드를 이용했고 row정보를 얻었으니 화면에 뿌려주는 역활은 굳이 안해도되기떄문에 위의코드처럼 따로 didSet속성을 이용해서 화면을 나타낸걸로 이해했는데 제가 이해한게 맞을까요?
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
변수 let 위치 질문입니다.
안녕라세요 강의 Result Type 8:18 부분에 switch문에서 해당하는case에 따라서 success,failure부분을 나눠서 하는 조건에서 let의 위치를 ()안에 쓸수도,바깥에 쓸수도있는걸 처음알았는데 혹시 이개념은 어떨때 사용하는지 알수있을까요? 그리고 해당 개념을 뭐라고 하는지도 알수있을까요?
-
해결됨성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
섹션 9 영상 잘림 확인 부탁드립니다
Movie Player 파트와 이어지는 Navigation Design 파트 사이에 영상이 잘린 것 같습니다. 확인 부탁드립니다. 반복해서 강의 잘 보고 있습니다 감사합니다
-
미해결Flutter 중급 1편 - 클린 아키텍처
type 에러
안녕하세요 선생님! 다름이 아니라 테스트 코드 작성중에result 를 Success로 캐스팅 하여 테스트 코드 실행 하였는데 터미널과 같은 에러가 발생하는데 무엇때문에에러가 뜨는지 모르겠어요 ㅠㅠ운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
안녕하세요 강의내용 질문입니다.
안녕하세요 좋은강의 만들어주셔서 감사합니다.혹시 싱글톤패턴하고 ARC부분은 강의파트중에서 어디부분에서 가르쳐주시는지 알려주실수있으신가요?또한 개인적으로 여쭙고싶은건 강사님 강의들으면서 개인 포트폴리오 앱을 하나 만들려하는데 강의전부를 듣고 만들어보는게 좋을지 아니면 포트폴리오만드는걸 강의들으면서 병행으로 하면좋을지 궁금합니다. 감사합니다!
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
이미지 기초 실행순서
안녕하세요 이미지로드 기초 실행순서가 헷갈려서 질문합니다.비동기방식으로 처리 안하면, 메인쓰레드는 직렬큐라 이미지뷰가 다 회전되고 난 후에 이미지 로드되는 시간이 오래 걸려야 하는것 아닌가요? 왜 쓰레드 락이 걸리는지 모르겠어요
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
UITableViewCell 높이 관련 질문입니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.활용 8번 앱을 만들어 보고 있습니다. 활용 8에 MyTableViewCell에 memberNameLabel과 addressLabel이 UIStackView에 추가 되어 있고, 제가 임의로 UIStackView 다른 Label도 넣어보았습니다. 그런데 글자가 짤리더라구요. 아무래도 tableView.rowHeight가 설정되어 있어서 그런 것 같은데, tableView.rowHeight를 고정으로 설정하지 않고 높이를 동적으로 설정하는 방법이 있을까요?검색해서 아래 두 코드도 추가해봤는데 높이가 고정으로 잡히네요 ㅠㅠ 해결 방법이 없을까요? 답변 부탁드립니다. 감사합니다. tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = UITableView.automaticDimensionextension ViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension } func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension } }
-
해결됨성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
맵 랜드마크 영상 잘림 확인부탁드립니다
맵 랜드마크 영상 Search Controller 파트 내용 중 앞부분이 전 영상과 이어지지 않는 것 같습니다. (서치 테이블뷰 작성 내용없음)앞 부분이 짤린 걸까요?
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
Main.sync 관련 질문입니다.
학습하면서 어려움이 있으면 DispatchQueue.global().async { DispatchQueue.main.sync { Thread.sleep(forTimeInterval: 1) print("finish1") } }위 코드의 굵은 코드들이 실행될때, 어떤 thread들이 실행되고 있는지 설명 부탁드리고 싶습니다. 이렇게 thread가 진행된다고 이해하면 맞나요?
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
섹션 8. 앱 만들기 - 맵 랜드마크 에 누락된 부분이 있는 것 같습니다.
2번째 영상과 3번째 영상 사이에 SearchResultTableViewController 작성 부분이 누락된 것 같습니다. 확인 부탁드립니다.
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
[앱 만들기 - ToDo List] 챕터 TableView 만들기에서
강의에서는 ViewController의 createrTodo() 메소드에 아무런 구현도 하지 않았는데 마지막에 `+` 버튼으로 상세 화면으로 이동하는 모습이 나옵니다. xib으로 뷰컨트롤러 생성 후 네비게이션 컨트롤러에 푸쉬하는 내용이 동영상에서 빠진거같네요.
-
미해결Objective-C 강좌 - 12개 앱 만들면서 배우는 iOS 아이폰 앱 개발
custom cell 강의 부분에서 main storyboard와 빌드후 적용이 다름
table view main sotryboard 에서 height크기를 변경해도 빌드후에는 반영이 안되네요 어떻게 해야하나요 직접코드를 height를 지정(- (CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath { return 200;})해야 하나요?
-
미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
비동기 개념에서 무엇을 return하는 거죠??
비동기 개념에서 즉시 리턴 한다고 하셨는데 무엇을 리턴하는지 궁금합니다!
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
decode함수가 실패해요
let string = String(data: safeData, encoding: .utf8)!safeData를 String으로 파싱하여 string을 print하면 데이터가 잘 출력되는걸 확인할 수 있어요.try JSONDecoder().decode(MusicData.self, from: safeData)하지만 MusicData.self에 파싱하면 실패합니다. print(safeData)의 결과값은 "77185bytes"로 데이터의 크기만 출력해주는데, 어떻게 하면 MusicData에 데이터를 담을 수 있을까요?
-
미해결Flutter 중급 1편 - 클린 아키텍처
안녕하세요 선생님 아키텍쳐 관련해서 질문드릴것이있습니다.
일단 선생님의 강의를 듣고 제 생각을 정의해보자면데이터레이어(데이터소스, 레퍼지토리(구현))도메인레이어(레퍼지토리(추상), 모델, 유스케이스)프레젠트레이어(뷰 모델, 뷰)레퍼지토리는 기본적으로 외부데이터와의 소통을 위한 통로라고 이해했습니다그렇기 때문에도메인레이어에서 레퍼지토리를 추상화하고데이터레이어에서 이를 구현하는 방식으로 사용되고이 레퍼지토리를 유스케이스에서 도메인레이어의 모델과, 레퍼지토리를 이용해우리 도메인의 입맛에 맞는 데이터형식과 로직을 작성하지요이런 상황속에서 몇가지 의문이 들었습니다 -첫번째질문!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-만약 외부데이터와 관련이 없는 온리 client 내부적으로만 필요한 상태를 관리해야하는 로직이 필요하다.그렇다면도메인 레이어에 필요한 모델을 작성하고레포지토리없는 유스케이스를 만들면외부데이터와 관련이 없는 상태를 관리할수있지 않을까?=> 외부데이터와 관련없는 데이터 관리가 필요할경우레포지토리가 없는 유스케이스에대한 생각이 궁금합니다!! (레포지토리가 필요없는 유스케이스의 경우쉽게 생각하면 viewModel에서 작성하면 되는 로직 아니야?라고 생각할수있는데, 만약해당 데이터 타입과 로직이 꽤많은 화면에서 공통적으로사용되고있다면 모든 뷰에 대응하는 모든 뷰모델에서같은 로직을 계속해서 반복하게될텐데비효율적일것같아서레포지토리 없는 유스케이스라는 것을 생각하게되었습니다.) -두번째질문!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-비지니스로직은 유스케이스에UI로직은 뷰모델에 작성한다고해주셨는데비지니스 로직과 UI로직을 나누는 기준이 무엇인지 궁금합니다.어떤걸 유스케이스에 넣고어떤걸 뷰모델에 넣어야하는지에 대한혼란이 있을때가 있어서요!! -세번째질문!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-노트관련강의30번째 강의의 두번째화면 UI작성 28분쯤해당 색깔을 선택할때 배경색이 바뀌는 로직이뷰에서 로직이 선언되어있는데,뷰모델에서 해당 로직을 선언하지 않은 이유가 궁금합니다! 선생님의 강의 정말 잘 듣고있고매번 너무 감사드립니다ㅜㅜ질문 세가지 드렸는데,글이 길지만 세가지 질문에 대한답변 주시면 정말 감사하겠습니다ㅜㅜ
-
미해결야곰의 iOS 프로그래밍
강좌소개의 overview
강좌소개의 overview가 어디에 있나요?
-
해결됨[Lv.1] 누구나 할 수 있는 - SwiftUI Basic with iOS 17
안녕하새요(ViewModel)
안녕하세요. 강의 잘 보고 있어요.다름이 아니라, ViewModel 강의에서 @StateObject 래퍼 변수가 하위 뷰(Sub View)와 데이터를 공유하는 과정을 적는 코드에서 Swift 문법과 SwiftUI 문법이 혼동되어 질문을 드립니다. 강의를 보면,FruitBasicView(상위 뷰)에서 SecondView(하위 뷰)를 불러 올 때,상위 뷰의 fruitViewModel 변수를 하위 뷰에 전달해주고 있습니다. (44줄) 그런데, 이미 하위 뷰는 @ObservedObject 래퍼 변수 형태로 FruitViewModel()로 초기화를 한 상태인데(60줄), 상위 뷰의 데이터가 하위 뷰로 전달 될 수 있는 건가요? 상위 뷰의 데이터와 하위 뷰의 데이터가 따로 노는 게 아닌가요? 구조체의 멤버와이즈 이니셜라이저가 이미 초기화된 변수에 대해서도 다시 초기화가 가능한지도 (강의를 보니) 헷갈려서 타이핑을 따로 해보니 그건 안되더군요. @StateObject와 @ObservedObject 래퍼의 예외 사항인 건가요?
-
미해결Flutter 중급 1편 - 클린 아키텍처
UI Event의 리턴값을 이용하고 싶습니다
안녕하세요, 좋은 강의 잘 듣고 있습니다.이벤트 컨트롤러를 이용하여 스낵바 이벤트를 발생시키는 부분에서 질문이 있습니다.스낵바 대신 alertDialog를 사용하려 하는데, alert사용자가 선택한 값을 받아오려면 어떻게 하면 될까요?result 값에 따라 분기를 태우고 싶은데, showDialog 이벤트를 사용하는 곳이 많아 showDialog 함수 내에서 분기를 태우긴 찝찝합니다.event.when( showDialog: () async { dynamic result = await showDialog( context: context, barrierDismissible: false, // user must tap button! builder: _buildPopup, ); // 여기에서 if (result==~) 하기엔 범용성이 적다 return result; },