본문 바로가기

iOS41

[iOS] NSOperationQueue와 GCD Queue의 차이점 NSOperationQueue와 GCD Queue의 차이점에 대해서 기록해보겠습니다. iOS에는 멀티스레딩을 할 수 있는 두 가지 방법이 있습니다. GCD(Grand Central Dispatch)는 C 기반의 low-level API이고 NSOperation은 Obj-C 기반으로 만들어진 high-level API가 있습니다. NSOperationQueue NSOperation 객체의 우선순위 및 준비 상태에 따라 대기열에 있는 객체를 실행한다. Operation Queue에 추가된 작업은 작업이 완료될 때까지 대기열에 남아 있다. 작업이 추가된 후에는 대기열에서 직접 제거할 수 없다. 모든 작업이 끝나지 않은 상태에서 Operation queue를 중지시키면 메모리 릭이 발생할 수 있다. GCD에서는.. 2021. 1. 29.
[iOS] URLSession API URLSession과 관련해서 기록해보겠습니다. URLSession HTTP/HTTPS를 통해 콘텐츠(데이터)를 주고받기 위해 API를 제공하는 클래스입니다. 앱이 실행중이지 않거나 일시 중단된 동안 백그라운드 작업을 통해 콘텐츠를 다운로드 하는 것을 수행하기도 합니다. 이 API는 URLSessionDelegate와 URLSessionTaskDelegate를 사용하여 인증을 지원하고 리다이렉션과 task completion과 같은 이벤트를 수신할 수 있습니다. 앱은 하나 이상의 URLSession 인스턴스를 생성하며 각 인스턴스는 관련 데이터 전송 작업 그룹을 조정합니다. 예를 들어, 웹 브라우저를 만드는 경우 앱은 탭 또는 창(window)당 하나의 세션을 만들 수 있습니다. 각 세션 내에서 앱은 특.. 2021. 1. 21.
[iOS] AppDelegate & SceneDelegate 앱에서 AppDelegate와 SceneDelegate에 대해서 알아보겠습니다. iOS 13 이전 버전의 앱에서는 app delegate가 앱의 실행과 포그라운드, 백그라운드에 대한 로직을 처리하는 역할을 했습니다. iOS 13 버전부터는 app delegate의 역할이 app delegate와 scene delegate로 나뉘어졌습니다. 그 이유는 아이패드 OS의 새로운 멀티윈도우 지원 기능의 결과라고 합니다. AppDelegate 애플리케이션 단계의 라이프 사이클 이벤트에 대해 처리를 담당합니다. 기본 메서드 func application(_:didFinishLaunchingWithOptions:) -> Bool 이 메서드는 앱이 시작되고 앱의 설정이 완료되면 호출됩니다. iOS 13 이전 버전의 앱.. 2021. 1. 19.
[iOS] App의 Life Cycle 앱이 포그라운드나 백그라운드에 있을 때 시스템 알림에 응답하고 다른 중요한 시스템 관련 이벤트를 처리한다. Overview 앱의 현재 상태에 따라 언제든지 할 수 있는 것과 하지 못하는 것이 결정된다. 예를 들어, 앱이 포그라운드 상태일 때 사용자의 주의를 끌기 때문에, CPU를 포함한 시스템 자원의 우선순위를 갖는다. 반대로 앱이 백그라운드 상태일 때 화면에 없기 때문에 가능한 한 적은 일을 해야하고 아무것도 안하는 것을 선호한다. 앱이 변경되는 상태에 따라 앱의 동작을 조정해야 한다. 앱의 상태가 변경될 때, UIKit은 적절한 델리게이트 객체를의 메서드를 호출해준다. iOS13 이상 버전은 scene 기반 앱의 경우 라이프사이클 이벤트에 반응하기 위해 UISceneDelegate 객체를 이용한다. .. 2021. 1. 16.
[iOS] 시뮬레이터에서 할 수 없는 것들 시뮬레이터에서 할 수 없는 것들에 대해서 정리해보겠습니다. 시뮬레이터는 효율성 좋은 도구지만 맥에서 실행되기 때문에 맥의 자원(CPU, memory 등)을 이용합니다. 그렇기 때문에 실제 아이폰 기기보다 빠르게 동작할 수 있습니다. 결과적으로, 시뮬레이터로는 실제 아이폰 기기와 같이 정확한 테스트를 할 수 없습니다. 또한, 사용자의 손 대신 마우스와 키보드를 이용해서 앱을 사용하기 때문에 손으로 동작했을 때의 문제점을 알 수 없는 경우가 있습니다. 이 뿐만 아니라, 하드웨어와 API 차이가 있으며 앱을 테스트하는데 영향을 끼칠 수 있습니다. 하드웨어 차이 Motion 지원(가속과 회전) 오디오와 비디오 입력(카메라와 마이크) 근접 센서 (조도) 기압(고도)계 주변 광 센서 (자동 밝기 조절) API 차이.. 2021. 1. 12.
[iOS] Frame과 Bounds의 차이 먼저 frame이란 슈퍼 뷰(상위 뷰)의 좌표 시스템에서 뷰의 위치와 크기를 나타내는 사각형입니다. 반면, bounds는 자신의 좌표 시스템에서의 뷰의 위치와 크기를 나타내는 사각형입니다. 말로만 봐서는 이해가 안 되기 때문에 직접 view의 frame과 bounds를 출력해봤습니다. 초록색 뷰를 Safe Area의 좌측 상단과 우측 하단에 맞췄을 때 frame의 x, y 좌표가 바뀌는 것을 볼 수 있었지만 bound의 x,y 좌표는 바뀌지 않는 것을 볼 수 있습니다. 이를 통해 frame은 상위 뷰를 기준으로 위치를 정해줄 때 사용할 수 있다는걸 알았습니다. bound는 (0,0)을 디폴트로 정해져 있고 값을 변경하게 되면 아래 사진처럼 초록색 뷰가 새로 그려지는 것을 볼 수 있습니다. 그래서 boun.. 2021. 1. 12.
[iOS] UNUserNotificationCenter를 이용해서 로컬 푸시하기! iOS앱에서 로컬 노티피케이션을 푸시하기 위해서 UNUserNotificationCenter를 사용해보겠습니다. UNUserNotificationCenter는 앱 또는 앱의 확장에 대한 알림과 관련된 활동을 관리하기 위한 중심 객체라고 합니다. alert, badge, sound를 통해 사용자에게 알림을 주고 알림을 스케쥴링할 수 있습니다. 먼저 사용자에게서 권한을 얻어야 합니다. func requestNotiAuth() { let authOptions = UNAuthorizationOptions(arrayLiteral: .alert, .badge, .sound) UNUserNotificationCenter .current() .requestAuthorization(options: authOptions).. 2021. 1. 5.
[iOS] User Notification 로컬과 원격 알림은 앱에서 새로운 데이터를 사용할 수 있게 되면 사용자에게 알리는 방법입니다. 앱이 Foreground에서 실행되지 않는 경우(Background)에도 알림을 사용할 수 있습니다. 로컬 알림은 앱이 알림 세부 정보를 로컬로 구성하고 해당 세부 정보를 시스템에 전달한 다음 앱이 Foreground에 있지 않을 때 알림 전달을 처리합니다. 특정 시간 또는 특정 지리적 위치에 도달했을 때 사용자에게 알리는 캘린더와 할 일 목록 앱과 같은 앱에 적합합니다. 원격 알림은 앱 데이터의 일부 또는 전체가 회사 서버에서 관리되는 경우에 적합합니다. 원격 알림을 사용하여 사용자의 장치에 알림을 푸시할 수 있습니다. 예를 들어, 메시징 앱은 원격 알림을 사용하여 새 메시지가 도착하면 사용자에게 알립니다. .. 2020. 12. 29.
[iOS] Label에 취소선 긋기 ToDo 앱을 만들다가 Label에 취소선을 긋는 방법을 알아봤습니다. 할 일이 완료되면 제목에 취소선을 그어서 표시할 때 사용할 수 있습니다. extension String { // 취소선 긋기 func strikeThrough() -> NSAttributedString { let attributeString = NSMutableAttributedString(string: self) attributeString.addAttribute(NSAttributedString.Key.strikethroughStyle, value: NSUnderlineStyle.single.rawValue, range: NSMakeRange(0,attributeString.length)) return attributeString.. 2020. 12. 24.
[iOS] JSON 파싱 JSON 파싱하는 방법에 대해서 적어보겠습니다..! 우선 서버에 요청할 Request함수가 필요합니다. 아래 주석의 순서대로 함수를 만들어 줍니다. func performRequest(with urlString: String) { // 1. URL 만들기 if let url = URL(string: urlString) { // 2. URLSession 만들기 let session = URLSession(configuration: .default) // 3. session에 task 할당 let task = session.dataTask(with: url) { (data, response, error) in if error != nil { self.delegate?.didFailWithError(erro.. 2020. 12. 4.