[iOS] App Development

[iOS] 특정함수 특정 시간에 호출하기 / String->Date로 타입변환시 Date Format 관련 유의사항

ddgoori 2021. 12. 21. 01:54

D-Day앱을 만들며, 밤 12시가 지나면 하루가 지나기에 D-Day계산을 다시 해줘서 데이터를 뿌려줘야 했다. 

 

1. 특정 시간에 함수 호출하는 법

 // 특정시간에 실행되도록
        let calendar = Calendar.current

        let now = Date()
        let date = calendar.date(
            bySettingHour: 22,
            minute: 03,
            second: 0,
            of: now)!

        let timer = Timer(fireAt: date, interval: 0, target: self, selector: #selector(runCode), userInfo: nil, repeats: false)
        
         RunLoop.main.add(timer, forMode: RunLoop.Mode.common)
    // 특정 시간에 실행되는 함수
    @objc func runCode() {
        print("Do whatever here!")
    }

유의!

  • Foreground상태일 때 실행 O
  • Background - Running 상태일 때 실행되지 않음 X
  • 지정한 시간이 지난후 다시 Foreground로 오면 시간이 해당 시간이 지났으면, Foreground로 전환되는 시점에 runCode가 실행 O
    • ex) 지정시간 22:01 상태에 백그라운드에 머물다 22:03에 다시 포그라운드로 오면, 포그라운드로 전환되는 시점에 코드가 실행됨

 

할 일

 

2. runCode에 firestore에 저장된 bornDate 가져오기 

3. String to Date로 타입 변경하고, Caledder객체의 current Date 기반으로 daysbetween 계산하기

* String->Date로 타입변환시 Date Format 관련 유의사항

나같은 경우 Apr 30, 2020으로 저장된 String 타입 데이터를 Date 타입으로 변환할 시 아래와 같은 포맷으로 변환하려 하여 오류가 났다.

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd"  // X
        dateFormatter.dateFormat = "MMM d, yyyy"  // O

Apr 30, 2020는 dateFormatter.dateFormat = "MMM d, yyyy" 로 변환해야 타입변환이 잘 이루어진다.

 

 

4. 계산된 D-day 기반으로 지나온 주수 계산

5. D-Day와 D+주수 UI 업데이트

 

 

 

 

*출처

 

DateFormatter Date and Time Cheatsheet

A cheatsheet and a manager?

stevenpcurtis.medium.com