적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

반응형

Swift iOS 앱 개발/iOS 32

[iOS GCD] Concurrency 동시성 프로그래밍이란? + 왜 필요할까

작업(task)을 분산시키고 여러 스레드에서 동시에 일을 할 수 있도록 처리하기 위해서 Sync & Async : 단일 작업. 작업 하나를 수행하는 특성? synchronous : 동기. 큐에 추가된 작업이 종료될때까지 기다리는 것. 한번에 하나의 작업만 실행되도록. 장점 : 설계가 매우 간단하고 직관적 단점 : 응답이 주어질 때까지 대기해야함 asynchronous : 비동기. 큐에 작업을 추가하지만 완료 응답을 기다리지 않고 동시에 실행될 수 있어, 여러 작업을 동시에 처리할 수 있도록 해주는 특성. 장점 : 응답을 기다리지 않고 다른 작업을 하므로 자원을 효율적으로 사용할 수 있다 단점 : 동기보다 설계가 복잡하다. Serial & Concurrent - Serial Queue : 작업들을 한번에 ..

[Swift GCD] GCD(Grand Central Dispatch)

멀티코어 환경에서 프로그램의 성능과 반응성을 높이고 더욱 효과적으로 사용할 수 있도록, 시스템 수준에서 GCD가 디스패치 큐를 이용해 multi threading을 지원하고 동시 작업을 관리해준다. 디스패치 큐는 작업들이 여러 쓰레드에서 동기적 or 비동기적으로 동작하며 동시에 일을 할 수 있도록, 큐(Queue)를 이용해 작업을 분산 처리 하는 FIFO 대기열이다. 디스패치 큐의 종류에는 main, global, private 큐가 있다. main 큐에서 실행되는 main thread는 iOS 에서 오직 하나만 존재하고, 모든 UI 작업들이 이 메인 쓰레드에서 처리된다. 메인 큐는 한 번에 하나의 task 밖에 실행하지 못하는 serial 큐이기 때문에, UI 실행에 영향을 끼칠 수 있는 네트워크 호출..

[iOS] Bounds와 Frame의 차이점

Frame은 상위뷰 기준, Bounds는 자기 자신을 기준으로 좌표를 나타낸다. Frame : 상위뷰의 좌표 시스템에서 뷰의 위치와 크기를 나타냄 Bounds : 자신의 좌표 시스템에서 뷰의 위치와 크기를 나타냄 frame은 UIView의 위치나 크기를 설정할 때 사용한다. 스토리보드에서 우측에 X좌표와 Y좌표가 frame의 좌표. bounds는 View의 크기를 알고 싶거나 View내부에 그림을 그릴 때 사용한다.

SceneDelegate에서 code base로 화면 진입점 설정하는 법

스토리보드 없이 코드로 화면 진입점 설정하는 법 xcode 11 부터 멀티 윈도우를 지원하기 위해 SceneDelegate가 추가되었다. SceneDelegate 지우고 그냥 기존처럼 AppDelegate만 설정해줘도 되지만, SceneDelegate에서 code base로 화면 진입점을 설정해보았다. 방법은 비슷하다 1. Storyboard 삭제 2. Info.plist 에서 Storyboard Name 삭제 3. TARGETS - General - Deployment Info - Main Interface 에서 "Main" 지워주기 4. SceneDelegate에서 화면 진입점 설정 func scene(_ scene: UIScene, willConnectTo session: UISceneSession..

[Swift iOS] 처음엔 어렵지만 알고나면 너무나도 편리한 UIStackView 사용법

UIStackView https://developer.apple.com/documentation/uikit/uistackview 스토리보드로 UI를 구성할 경우, constraint 같은거 설정하기가 편하지만 Code base 로 UI를 구현할 경우, 굉장히 복잡하고 까다로워진다. 이럴 때 StackView를 잘 사용하면 한결 편하게 화면을 구성할 수 있는 것 같다. let stack = UIStackView() stack.axis = .horizontal stack.spacing = 8 stack.distribution = .fill stack.alignment = .leading stack.layoutMargins = UIEdgeInsets(top: 16, left: 16, bottom: 16, ri..

[Swift iOS] imageSlideShow

이미지 슬라이드 쇼를 간편하게 적용할 수 있는 ImageSlideShow 라이브러리를 사용해보았다. https://github.com/zvonicek/ImageSlideshow GitHub - zvonicek/ImageSlideshow: Swift image slideshow with circular scrolling, timer and full screen viewer Swift image slideshow with circular scrolling, timer and full screen viewer - GitHub - zvonicek/ImageSlideshow: Swift image slideshow with circular scrolling, timer and full screen viewer g..

UICollectionViewDelegate

UICollectionViewDelegate : manages user interactions with the collection view’s contents, including item selection, highlighting, and performing actions on those items. The methods of this protocol are all optional. 컬렉션뷰 셀 선택 및 선택 후 액션 등에 관련한 메서드들을 다루는 delegate로, 이 프로토콜의 모든 메서드는 옵셔널이다. Managing the Selected cells didSelectItemAt : 선택된 cell의 index path를 delegate에게 알려주는 메서드. func collectionView(_ ..

[Swift iOS] 앱에서 web 페이지 여는 방법 세 가지

iOS에서 webView를 보여주는 방식 3가지 - 외부 브라우저(사파리)로 열기 - SFSafariViewController - WKWebView 1. 외부 브라우저(사파리)로 열기 앱 내부 작동과 무관하게 외부 브라우저에서 여는 방법이다. @objc func openSafari(_ sender: Any) { if let url = URL(string: "https://hongssup.tistory.com") { UIApplication.shared.open(url, options: [:]) } } UIApplication.shared.canOpenURL(url) : if 문에서 이 조건을 추가로 넣으면, 링크가 유효하지 않을 경우 사파리 앱으로 아예 안넘어갈 줄 알았는데 그건 아니더라. 딱히 있고 없..

[Swift iOS] Custom Camera 커스텀 카메라 만들기

Info.plist에서 Privacy - Camera Usage Description 추가해주기 import AVFoundation Define Instance Variables var captureSession: AVCaptureSession! var photoOutput: AVCapturePhotoOutput! var videoPreviewLayer: AVCaptureVideoPreviewLayer! viewDidLoad() captureSession = AVCaptureSession() captureSession.beginConfiguration() guard let captureDevice = AVCaptureDevice.default(for: AVMediaType.video) else { ret..

728x90
반응형