동기와 비동기.
고급 프로그래밍 수업 때 비동기 프로그래밍으로 블랙잭 게임을 만들었던 기억이 난다.
교수님은 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
결론
세 줄 요약
1. 하던대로 걍 하면 되겠지 머 ㅋㅋ
2. 응? 앱이 멈추네 ㅋㅋ
3. 아뿔사 Asyncronous는 매우 중요하다.
'프로그래밍 > App 개발' 카테고리의 다른 글
[Xamarin] Messaging Center (0) | 2020.10.20 |
---|---|
[Xamarin] UIModalPresentationStyle (0) | 2020.10.20 |
[android] 앱 종료 시 블루투스 해제되는 issue (1) | 2020.08.06 |
[android] 안드로이드 wav 레코딩 (20.06.28 깨달은점) (0) | 2020.08.06 |
[android] 구글맵 선긋기 (2) | 2020.08.06 |