전체 글
-
Rxswift - 에러 발생 이후 작업 재시도가 되지 않는 문제 해결프로젝트 2024. 2. 11. 14:44
문제상황 버튼을 탭하면 답글을 서버에 등록하는 비동기 작업을 수행하려는데, 한 번 에러가 발생하면 다시 버튼을 눌러도 작업이 실행되지 않는 문제가 발생했다. 문제해결과정 이 상황에서 필자가 설정한 목표는 다음과 같다. 1. 에러 발생 후에도 답글 등록 작업을 시도할 수 있게 한다. 2. 등록 시도할 때마다 에러 발생 시 에러 메시지를 보여주도록 한다. 이 문제가 발생했을 때의 댓글 등록 작업을 수행하는 subscription 코드는 다음과 같다. // "등록" 버튼 탭할 시 서버에 답글을 등록 addReplyButton.rx.tap .flatMap { [weak self] in guard let self else { return Observable.empty() } return self.viewModel..
-
Core Data에서 의도치 않은 entity 생성 문제 해결프로젝트 2023. 3. 30. 15:23
문제 상황 SwiftUI와 Core Data를 사용하여 과거의 기억을 회고하는 앱을 만들고 있었다. 그런데 사용자가 Core Data entity를 만들다가 저장하지 않았는데, 다른 탭에 있다가 원래 탭으로 돌아오면 의도치 않게 생성되어 있는 상황이다. 문제 분석 view context의 save() 메서드의 경우, 공식문서의 정의에 의하면 저장되지 않은 변경사항을 commit하는 메서드이다. 이러한 정의를 참고해 봤을 때 버그 발생 과정은 다음과 같다. 왼쪽 탭에서 오른쪽 탭으로 넘어갈 때 저장되지 않은 entity가 방치됨 오른쪽 탭에서 카테고리 entity에 대한 CRUD를 하면서 view context의 save() 호출 왼쪽 탭에서 방치된 entity도 저장됨 왼쪽 탭으로 돌아오면서 fetch ..
-
view controller unit test에서 presentedViewController 문제프로젝트 2023. 3. 18. 17:37
문제 상황 view controller에서 modal sheet에 대한 테스트를 하기 위해 다음과 같이 테스트를 작성하였다. modal sheet가 정상적으로 보이는 지를 테스트하기 위해 root view controller의 presentedViewController프로퍼티 값을 체크하는 테스트이다. final class MapViewControllerTests: XCTestCase { func testViewController_whenSelectAttraction_updatesUI() { // ... XCTAssertEqual(sut.presentedViewController, sut.attractionInfoSheetController) // ... } } 테스트를 통과할 수 있도록 다음과 같이 s..
-
공공 API 호출 시 SSL 에러 해결프로젝트 2023. 3. 15. 21:00
문제 상황 실제로 API 호출 시의 기능이 잘 처리되는지를 파악하기 위해 MockURLSession 대신 진짜 URLSession을 주입한 NetworkManager에 대한 테스트를 작성하였다. final class NetworkManagerIntegrationTests: XCTestCase { let sut = NetworkManager(session: URLSession.shared) func testFetchAttractions() { let expectation = expectation(description: "Task must be executed.") Task { do { let attractions = try await sut.fetchAllAttractions() XCTAssertEqual..
-
페이징 기법운영체제 2022. 7. 15. 23:34
페이징 기법 가상 주소의 분할된 각 영역을 페이지(page)라 부르며, 물리 메모리의 각 영역은 프레임(frame)이라 한다. 프레임과 페이지는 크기가 같으며, 둘 다 번호를 매겨서 관리한다. 페이징을 구현하기 위해서는 결국 페이지 번호와 프레임 번호를 매칭하는 테이블을 페이지 테이블을 관리해야 한다. 페이징 기법의 주소 변환 주소 변환 과정 CPU에서 접근하는 모든 논리 주소는 페이지 번호(p)와 페이지 시작 주소로부터의 거리인 offset(d)로 구성된다. 예를 들어 CPU의 비트 수가 m이고, 각 페이지 크기가 2^n이라 하면, 앞의 m - n 비트는 페이지 번호로 사용하고, 뒤의 n개 비트는 페이지 시작 주소로부터의 offset으로 사용한다. 페이지 테이블을 통해 페이지 번호로부터 프페임 번호를 ..
-
가상 메모리 개요운영체제 2022. 7. 14. 20:29
가상 메모리 가상 메모리는 크기가 다른 여러 물리 메모리에서 일관적으로 프로세스를 실행하는 기술이다. 가상 메모리 시스템의 모든 프로세스는 자신이 물리 메모리에 어느 위치에 있는지에 상관없이 0에서부터 시작하는 연속된 메모리 공간을 가진다. 이러한 주소는 가상 주소 또는 논리 주소라 한다. 가상 메모리는 이론상 무한대지만, 실제로는 물리 메모리의 크기와 스왑 영역의 크기의 합로 한정되며, CPU에 비트(32bit/64bit)에 따라 결정된다. 스왑 영역은 하드디스크에 존재하지만 메모리 관리자가 관리하는 영역으로 메모리의 일부로 취급된다. 물리 메모리가 꽉 찬 상태에서 새로운 프로세스를 실행할 때는 일부 기존 프로세스를 스왑 영역으로 보내는데, 이를 스왑 아웃(swap out)이라 한다. 몇 개 프로세스가..
-
Animation 추가iOS/UIKit 2022. 7. 13. 00:33
Constraint 기반 animation 추가 이번에는 로그인 화면에서 title label과 subtitle label이 왼쪽에서 오른쪽으로 이동하는 에니메이션을 구현할 것이다. 우선 LoginViewController에 다음 3개의 프로퍼티를 추가하자. // animation var leadingEdgeOnScreen: CGFloat = 16 var leadingEdgeOffScreen: CGFloat = -1000 var titleLeadingAnchor: NSLayoutConstraint? 기존의 title constraint를 지우고, 다음 코드로 바꾸자. 이 상태에서 실행하면 titleLabel.leadingAnchor 가 view.leadingAnchor보다 1000px만큼 왼쪽에 있기 때..
-
로그아웃 기능 구현 및 세부 수정iOS/UIKit 2022. 7. 12. 20:14
로그아웃 구현 로그아웃 버튼 추가 먼저 AccountSummaryViewController에 로그아웃 버튼을 프로퍼티로 추가하자. lazy var logoutButtonItem: UIBarButtonItem = { let barButtonItem = UIBarButtonItem(title: "Logout", style: .plain, target: self, action: #selector(logoutTapped)) // 에러 barButtonItem.tintColor = .label return barButtonItem }() 에러를 없애기 위해 selector로 사용할 메서드를 추가하자. extension AccountSummaryViewController { @objc func logoutTappe..