봉식이와 캔따개

[iOS] 어쩌다 마주친 동기/비동기 본문

iOS/TIL

[iOS] 어쩌다 마주친 동기/비동기

봉식이누나 2023. 8. 13. 18:29
반응형

 

 

 

API를 사용하고 네트워크 통신을 시작하니, 동기 비동기가 뭔지 공부하기 전에 관련한 문제와 맞닥뜨렸다😩

 

 

🥲 첫 번째 만남...

 

 

간단한 번역 앱인데,

내가 작성하는 언어를 감지 → 선택한 언어로 번역 해주는 기능을 구현했다.

 

원래 한국어 영어로 번역해주는 기능만 구현해놓았던 것을 수정하기로 한 것인데

그래서 기존 코드는 이런 구조였다.

 

@IBAction func buttonClicked() {

	// 한 -> 영 번역해줘
	AF.request().validate().responseJSON { response in
    	//가져온 결과값 TextView에 적용
	}

}

 

 

 

번역하기 버튼을 누르면 파파고 번역 API를 호출해서 결과값을 TextView에 보여주는 방식.

 

 

아무것도 몰랐던 나는... 저걸 수정해서 이렇게 만들었다.

 

 

@IBAction func buttonClicked() {

	detectLang()
    
	// 위에 함수 호출로 알아낸 값 사용해서 원하는 언어로 번역해줘
	AF.request().validate().responseJSON { response in
    	//가져온 결과값 TextView에 적용
	}
    
}

func detectLang() {

	// 어떤 언어로 작성됐는지 알려줘
	AF.request().validate().responseJSON { response in
    	//가져온 결과값 변수에 저장
	}
    
}

 

 

 

내가 생각한 흐름은

 

1. 언어감지해서 무슨 언어로 작성됐는지 알기

2. 1번에서 알아낸 언어를 파라미터로 넘겨, 원하는 언어로 번역한 결과 가져오기

3. TextView에 결과값 넣어주기

 

이런 순서였다. 

 

분명 코드는 잘 작성했는데 invalid 어쩌구 에러가 떠서 살펴보니 2번에서 문제가 있었다. 

 

 

 

알고보니 내가 생각한 것과 다르게

 

1. 언어 감지해서 무슨 언어로 작성됐는지 알려줘!

2. 원본 언어에 대한 파라미터가 없음 ㅠㅠ 실패

3. TextView에 결과값 넣어주기 → 가져온 값이 없으니 빈 칸

4. 이거 무슨 언어로 작성됐는지 알아왔어!

 

이런 순서로 동작하고있었다 엥? 🤣 ㅋㅋㅋ 

 

 

잘은 모르지만 일단 느낌적인 느낌으로 뭐가 문제인지 알 것만 같아서

 

@IBAction func buttonClicked() {
    
	// 어떤 언어로 작성됐는지 알려줘
	AF.request().validate().responseJSON { response in
    	
        // 가져온 결과값 변수에 저장하고 translate 함수 호출
        translate()
        
	}
    
}

func translate() {

	// 번역해줘
	AF.request().validate().responseJSON { response in
    	//가져온 결과값 TextView에 적용
	}
    
}

 

 

언어 감지 API를 호출해서 값을 받아오는 클로저 안에, 번역 함수 (번역을 위한 API 호출, 결과값 넣어주는 기능을 구현한..)를 넣어주는 방식으로 해결하고 넘어갔다. 

 

 

 

 

 

 

🥲 두 번째 만남...

 

 

왠지 알 것만 같았던 동기 비동기에 관한 내용을 공부한 후... 아주 조금 더 알 것 같은 수준이 됐다.

 

너무 어려워서 일단 잠깐 외면하고 TMDB API를 사용해서 최신 영화를 Table View로 보여주고

영화를 누르면 영화의 등장인물 목록을 보여주는 기능을 구현하고있었다.

 

 

1. API 통신으로 데이터 가져오기

2. Table View reload

 

요런식으로 데이터를 가져온 뒤 테이블 뷰 데이터를 리로드 해주려 했는데

 

func getMovieList() {

	// 영화 데이터 가져와줘
	AF.request().validate().responseJSON { response in
    	//가져온 결과값 array에 넣어줌
	}
    
    self.movieListTableView.reloadData()
    
}

 

 

데이터는 잘 가져오는 걸 확인했는데 테이블뷰에 아무것도 나오지 않았다...

 

코드를 살펴보다가 실수를 알아채고 바로 수정.. 테이블뷰 리로드 하는 부분을 클로저 안으로 넣어주었다.

 

비동기라는 개념 자체가 완벽하게 이해가 안된데다가

클로저 개념도 뭔가 확 와닿지 않고 ..

 

함수 = 하나의 실행 단위

라고 자꾸 생각되어서 깊게 생각하지 않으면 실수하게 되는 것 같다.

 

 

 

흐어어엉.... 😢

반응형
Comments