무비 모델을 만들었다
그리고 무비모델이 바인딩된 변수도 선언해줌
근데 MoviewModel 이름을 바꾸고 싶을 수 있잖음
이렇게 TVModel로 바꿔주고 싶어졌다고 치면
MovieModel로 사용하던 것들은 코드를 수정해야함
그런 작업들을 줄여줄 수 있는게 typealias임!
typealias 원하는 이름 = 이름 바꾸고 싶은 타입
요렇게
뷰모델이 있고
텍스트를 탭하게되면 뷰모델에서 데이터를 가져오는 걸 표현한다고 가정해보자
지금 같은 경우는 downloadData()의 내용이 차근차근 스탭에 맞춰서 실행되게됨 (synchronous)
비동기로 실행될 downloadData2 메소드를 만들어줌
인터넷에서 데이터를 다운로드 하는 상황을 표현해주기 위함임
이 때 함수의 선언부에 명시해준 반환타입 String이 원래라면
즉시 반환이 되야하지만 그렇지 않아서 지금처럼 에러가 발생하게 됨
클로져로 파라미터를 수정해줌
이 때 스트링 data를 받고, 반환 값은 없는 형태로 만들었음
downloadData2를 자동완성해보면 지금처럼 만들어지는 걸 볼 수 있음
엔터를 누르게되면 트레일링 클로져 형태로 바뀌게 되는데 이 스코프 내에서 text의 값을 returnedData가 되게 바꿔줌
-> Void를 반환 한다는 건
func doSomething(_ data: String) -> Void {
//dosomething
}
func doSomething(_ data: String) -> () {
//dosomething
}
func doSomething(_ data: String) {
//dosomething
}
이 3가지는 같은 뜻임!
이렇게 클로져형태로 만들어줘도 에러가 발생함
이럴 때 쓰는 게 @escaping임
escaping으로 만들어주면 명시적으로 self가 붙어야한다고 또 에러가 보이는데
클로져에 작성된 비동기 작업이 이렇게 되면 strong reference가 되버려서
작업이 끝나기 전까지 뷰모델 인스턴스가 할당이 해제가 안되게 되버림
그럴 때 사용하는 게 [weak self] 입니다!! 아까 했었죠
요렇게!
String으로 받던 파라미터를 이번엔 struct 형태로 받아보자
DownloadResult라는 struct를 만들어주고 프로퍼티로 data를 구성해줌
이렇게 되겠죠
이렇게 구조체 형태로 파라미터를 받게되면 좋은 점이 데이터의 항목들이 많아지게 되면
returnedResult.data 형태로 닷 을 사용해서 바로바로 접근이 가능함
여기에 typealias 까지 사용하면
홀리몰리 과카몰리
요렇게 메소드가 구현이 가능해집니다!!!!