ALC ( App Life Cycle )


앱 생명주기는 앱의 시작과 끝 사이에 실행되는 여러가지 상태를 정의한것이다.

다양한 앱의 상황에서 대응해야 하기 때문에 반드시 이해하고 넘어가야 될 부분이다.



앱의 상태 구분




1. Not Running    -> 실행 하고 있지 않은 상태

2. Inactive             -> 실행 중인 상태지만 이벤트가 없는 상태

3. Active                -> 실행 중이고 이벤트가 생긴상태 

4. Background    -> 백그라운드 상태에서 이벤트가 있는 상태

5. Suspended      -> 백그라운드 상태에서 이벤트가 없는 상태


2번과 3번을 묶어 보통 Foreground 라고 칭한다.



앱의 상태에 대응되는 함수


각 5가지의 상태는 

AppDelegate 에서 대응되는 함수가 정의되어 있어 상태에 따라 동작하는 코드를 작성하여 상태에 따른 동작을 수행할 수 있다.


func application (_: didFinishLaunchingWithOptions) {}

앱이 처음 시작될때 실행되는 함수


func applicationWillResignActive (_: application) {}

앱이 Active 상태에서 Inactive 상태로 진입 할때 실행되는 함수


func applicationDidEnterBackground (_: application) {}

앱이 Background 상태로 진입 할때 실행되는 함수


func applicationWillEnterForeground (_: application) {}

앱이 Background 상태에서 Foreground 상태로 진입 할때 실행되는 함수


func applicationDidBecomeActive (_: application) {}

앱이 Active 상태로 진입 할때 실행되는 함수


func applicationWillTerminate (_: application) {}

앱이 종료 될때 실행되는 함수


필수로 전부 구현해야되는 함수는 아니지만 상황에 따른 적절한 구현으로 깔끔하고 자연스러운 동작의 앱을 만들수 있다.

'Swift' 카테고리의 다른 글

[Swift] typealias  (1) 2018.05.28
[Swift] VLC ( View Life Cycle )  (0) 2017.11.09
[Swift] Thread  (0) 2017.11.07
[Swift] GCD (Grand Central Dispatch)  (1) 2017.11.07
[Swift] Email, Password Validation extension (이메일, 비밀번호 검증)  (0) 2017.05.25

스레드란 - 위키백과 참조


어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.

일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다.


스레드는 싱글스레드 와 멀티스레드 가 있고


보통 싱글스레드일때는 메인스레드만 있다고 생각하는게 좀더 이해하기 쉽지않을까싶다. 물론 정답은아님.

메인스레드 같은경우는 사용자와 상호작용을 하기 위한 UI를 책임지고있기에 아주 중요한 스레드이다.

그래서 오랜시간이 필요하거나 연산이 복잡한 작업을할때 메인스레드에서 작업하게되면

사용자 인터페이스와의 상호작용을 하는 스레드인만큼 사용자에게는 앱 자체가 느려보이고 좋아보이지않게되거나 작업이 꼬여 프로세스가 죽어버리게될 경우도있다.


그럴땐 멀티스레드를 활용하여 메인스레드가 아닌 별도의 스레드에서 작업을 처리하고 

결과물을 메인스레드를 통해 반영하는방법이 제일 좋은방법인것 같다.



GCD 란


Multicore Process 를 위한 Thread programming 의 방법이다.

기존의 스레드 관리는 직접 락을 걸고, 스레드풀을 관리하는 수고가 있었지만

GCD는 스레드를 OS 에서 관리하고 분배한다.


Dispatch Queue


Dispatch Queue는 작동방식이 Serial이든 Concurrent든 항상 FIFO ( First in First out ) 방식으로 동작한다.


Queue 의 동작방식


Serial Queue -> 동작이 순차적으로 FIFO 한다.

Concurrent Queue -> 동작이 동시적으로 GCD 에서 컨트롤하여 FIFO 한다.



Queue 의 종류


여러가지의 Queue 중에 대표적으로 main과 global 이있다.


DispatchQueue.main


시스템시작시 자동으로 생성하는 메인스레드 큐 이다.

기본적으로 Serial Queue 로 동작한다.

대표적인 예로 UI 변경작업은 메인큐에서 실행해야한다.


DispatchQueue.global


메인스레드 큐 와 반대되는 개념으로 백그라운드에서 동작하는 큐이다.

기본적으로 Concurrent Queue로 동작한다.

대표적인 예로 서버와의 통신작업같은경우 시간이 얼마나 걸릴지 모르고 작업량이 많기때문에 

백그라운드로 실행하여 후처리를 메인큐에서 하는경우가있다.

Qos 를 활용하여 우선순위를 설정해줄수있다


DispatchGroup


여러가지 작업을 동시에 실행할때 Group을 Concurrent queue 로 작업하여 결과물을 빠르게 얻는다

Group queue는 실행되는 작업이 다 완료되었을때 Notify 를 호출하여 끝났다는 신호를 준다


Qos (Quality of Service)


작업을 Multi-threading & Concurrent 하게 실행하고자 할때 Qos 를 정의한 Global queue 를 사용한다

userInteractive

중요도가 높고 즉각적인 반응이 요구되는 작업을 실행할때 사용하는 Qos

UI 업데이트같은 유저의 액션에 즉각적으로 반응해야하는 작업이 필요할때 사용

Global queue 지만 main-thread 에서 실행된다

userInitiated

userInteractive 에 비해 우선순위는 낮지만 async 하고 빠른결과값을 기대할때 사용

utility

시간이 상대적으로 오래걸리는 작업을 위해 사용

I/O, 통신 등의 작업에 주로 사용

background

유저가 인지하지도 못하는 백단에서 실행되는 작업

utility 에 비해 상대적으로 천천히 작업하는경우 사용



Sync, Async


Sync


큐에 등록한 스레드가 작업이 끝날때까지 대기하고 작업이 끝났다는 신호가 오면 다음 큐를 실행한다. ( 등록해놓은 큐를 순차적으로 실행한다 )


Async


큐에 등록한 스레드가 작업이 끝날때까지 대기하지않고 다음 큐를 병렬로 실행한다. ( 등록해놓은 큐를 동시적으로 실행한다 )


차이점은 작업이 완료될때까지 기다리느냐 아니냐의 차이이다.

Sync 같은 경우 사용법을 제대로 숙지하지않으면 스레드가 죽지않는 교착상태에 빠질 수가있어 되도록이면 Async를 사용하는게 좋다.


After


큐에 등록한 스레드에 시간차를 두어 실행 할 수 있게 한다.









로그인 기능을 구현할때 빠지지않는 이메일, 패스워드 정규식 검사를 extension 으로 구현했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
extension String {
    
    // 이메일 정규식
    func validateEmail() -> Bool {
        let emailRegEx = "^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$"
        
        let predicate = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
        return predicate.evaluate(withself)
    }
    // 패스워드 
    func validatePassword() -> Bool {
        let passwordRegEx = "^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{8}$"
        
        let predicate = NSPredicate(format:"SELF MATCHES %@", passwordRegEx)
        return predicate.evaluate(withself)
    }
}



기본적으로 이메일이나 패스워드는 String 문자열로 처리하기때문에 extension 은 String으로 구현했고

샘플로 구현되어있는 정규식패턴은 

이메일은 기본적으로 사용되는 @. 패턴으로 구현되어있고

패스워드는 최소8자이상, 대문자, 소문자, 숫자 조합인지 검증하게되어있습니다


더 많은 extension 들은 개인적으로 GitHub에 올려두고 업데이트 및 관리를 하고있습니다.

https://github.com/oper0960/ExtensionsForSwift



회원가입시 ID 나 Password 같이 공백이 들어가면 안되는 문자열에 공백을 삭제하여 처리할 수 있게 할 수 있습니다.


1
2
3
4
5
6
7
extension String {
    
    // 문자열 공백 삭제
    func stringTrim() -> String {
        return self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
    }
}



더 많은 extension 들은 개인적으로 GitHub에 올려두고 업데이트 및 관리를 하고있습니다.

https://github.com/oper0960/ExtensionsForSwift

+ Recent posts