본문 바로가기
프로그래밍/App 개발

Syncronous, Asyncronous (오늘의 만나 iOS를 만들며 느낀점)

by 엽기토기 2020. 10. 2.
반응형

동기와 비동기.

 

고급 프로그래밍 수업 때 비동기 프로그래밍으로 블랙잭 게임을 만들었던 기억이 난다.

교수님은 asyncronous를 엄청나게 강조하며 중요하다고 하셨다. 거의 이 수업 마칠 때 이것 밖에 기억 안 날 정도?

 

예전에 만들었던 안드로이드 '오늘의 만나'(플레이스토어: play.google.com/store/apps/details?id=com.manna.parsing2)를 xamarin으로 포팅하며 느꼈던 점을 포스팅한다.

 

시작

먼저, '오늘의 만나'는 성경 묵상 범위와 해당 구절을 교회 홈페이지에서 크롤링하여 앱을 통해 보여주는 애플리케이션이다.

현재 150명 정도의 유저가 있고, 인원은 적지만 대부분의 분들이 매일 아침마다 사용한다고 들었다.

 

사용자가 늘어나면서 iOS 버전을 만들어달라는 여러 문의가 들어왔었고, 마침 회사에서 인턴을 하며 C#과 Xamarin을 학습해야해서, 공부하는 겸 Xamarin으로 iOS버전을 개발하게 되었다.

 

크롤링을 하기 위해 안드로이드는 Jsoup 라이브러리를 사용하였고, Xamarin은 Html Parser로 HtmlAgilityPack을 사용하였다.

거의 Jsoup과 사용법이 비슷해서 어렵지 않게 구현했다.

var mannarange = htmlDoc2.DocumentNode.SelectSingleNode("//div[@class='titlebox']/div[@class='title']").InnerText;

* 묵상 범위 html select 코드

 

var tmp = htmlDoc2.DocumentNode
                    .SelectNodes("//div[@class='contentbox fr-view']/p");

                string texts = "";

                foreach (HtmlNode node in tmp)
                {
                    texts += node.InnerHtml + "\n\n";
                }
                texts = Regex.Replace(texts, @"<br>", "\n\n");

* 구절 select하고, 줄바꿈 처리하는 코드

 

난관

가져오는 것까지는 뭐 금방 했다. 예전에 이미 삽질을 한 경험이 있기 때문에(...) 

그런데 이 http 통신하는게 참 무거운 작업이었음.

해당 함수를 실행 시키면 다른 버튼, 스와이프 등의 동작이 안되는 프리징 현상이 발생했다.

 

그래서 ActivityIndicator(로딩바)를 구현해서 자! 지금은 가져오는 중이야^^ 를 알리고자 했다.

근데 이것두 안됨ㅋㅋㅋㅋ

 

자 고민 시작. 고민한지 얼마 안되어 해답을 찾았다.

바로 비동기 프로그래밍이 필요했던 것이다.

 

이전엔 걍 코딩했기 때문에 코드가 동기 방식으로 수행이 되었던 것이고, 크롤링하는 작업을 수행하는 동안 다른 Task들은 모두 Block 상태가 된 것. 따라서 결과값이 나올 때까지 앱이 프리징된 것처럼 보였던 것이다!

 

따라서 코드를 비동기로 바꿨다.

HttpWebResponse resp = (HttpWebResponse)(await req.GetResponseAsync());
this.ReloadCommand = new Command(async () =>
            {
                await GetMannaText();
                IsReloading = false;
            });

 

크크 Asyncronous하게 바꿨더니 잘된다! pull to refresh 기능을 추가해서 새로고침도 넣었다! 잘된다!

 

github.com/Jinyeob/Today-Manna-iOS

 

Jinyeob/Today-Manna-iOS

:book: '오늘의 만나' iOS 버전. Contribute to Jinyeob/Today-Manna-iOS development by creating an account on GitHub.

github.com

결론

세 줄 요약

1. 하던대로 걍 하면 되겠지 머 ㅋㅋ

2. 응? 앱이 멈추네 ㅋㅋ

3. 아뿔사 Asyncronous는 매우 중요하다.

 

 

 

반응형