前提
GoogleCalendarAPIを叩いて10時から23時までの空き時間(予定が入っていない時間)を7日分取得するアプリを作っているのですが、最終的にスマホの画面にデータを表示させる際の都合により7日分一気にデータを取得するのではなく、1日ごとにデータを取得して、それを7日分並べたいと考えています。そこでデータの取得まではできたのですが、print関数でそのデータをコンソールに表示させたところ、日付の順番がバラバラになった状態で表示されてしまいました。
実現したいこと
データを正しい日付順にコンソールに表示させたいです。
該当のソースコード
Swift
1//遷移前のViewControllerではボタンをタップすると認証に必要なデータをSecondViewControllerに渡して画面を遷移するようにしています。 2 3import GTMAppAuth 4import GoogleAPIClientForREST 5 6class SecondViewController: UIViewController { 7 8 private var authorization: GTMAppAuthFetcherAuthorization? 9 typealias showAuthorizationDialogCallBack = ((Error?) -> Void) 10 11 var requestURL: String?//遷移前のページからリクエストURLを渡される(認証に必要なデータ) 12 var clientID: String = ""//遷移前のページからクライアントIDを渡される(認証に必要なデータ) 13 var iOSUrlScheme: String = ""//遷移前のページからURLスキームを渡される(認証に必要なデータ) 14 15 let calendar = Calendar(identifier: .gregorian) 16 17 var startDateTime = Date()//イベントの開始日時 18 var endDateTime = Date()//イベントの終了日時 19 20 let days = 7//7日分のデータを表示させる 21 22 override func viewDidLoad() { 23 super.viewDidLoad() 24 25 for period in 0..<days {//0時から翌0時までに入っているイベントを7日分取得する 26 //イベントの取得開始日時を指定する 27 self.startDateTime = calendar.date(bySettingHour: 0, minute: 0, second: 0, of: Date() + TimeInterval(60 * 60 * 24 * period))! 28 //イベントの取得終了日時を指定する 29 self.endDateTime = calendar.date(bySettingHour: 0, minute: 0, second: 0, of: startDateTime + 60 * 60 * 24 * 1)! 30 //イベントを取得する 31 self.get(startDateTime: self.startDateTime, endDateTime: self.endDateTime) 32 } 33 34 } 35 36 private func get(startDateTime: Date, endDateTime: Date) {//ログイン認証とイベントの取得 37 if GTMAppAuthFetcherAuthorization(fromKeychainForName: "authorization") != nil { 38 self.authorization = GTMAppAuthFetcherAuthorization(fromKeychainForName: "authorization")! 39 } 40 if self.authorization == nil { 41 ViewController().showAuthorizationDialog(callBack: {(error) -> Void in 42 if error == nil { 43 self.getCalendarEvents(startDateTime: startDateTime, endDateTime: endDateTime) 44 } 45 }) 46 } else { 47 getCalendarEvents(startDateTime: startDateTime, endDateTime: endDateTime) 48 } 49 } 50 51 func getCalendarEvents(startDateTime: Date, endDateTime: Date) {//イベントの取得 52 let calendarService = GTLRCalendarService() 53 calendarService.authorizer = self.authorization 54 calendarService.shouldFetchNextPages = true 55 56 let query = GTLRCalendarQuery_EventsList.query(withCalendarId: "primary") 57 print("AAA",startDateTime,endDateTime)//この時点では日時の順序が正しく表示される 58 query.timeMin = GTLRDateTime(date: startDateTime) 59 query.timeMax = GTLRDateTime(date: endDateTime) 60 61 calendarService.executeQuery(query, completionHandler: { (ticket, event, error) -> Void in 62 if let error = error { 63 NSLog("\(error)") 64 } else { 65 print("BBB",startDateTime,endDateTime)//ここでは日時の順序がバラバラになってしまう 66 } 67 }) 68 } 69}
試したこと
上記のコードは質問用に簡略化したものなのですが、簡略化する前に取得したデータをソートするなど試しました。
補足情報(FW/ツールのバージョンなど)
Xcode10.6
シミュレーターのiphone11で検証
あなたの回答
tips
プレビュー