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 업데이트
*출처