質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

0回答

326閲覧

GoogleCalendarAPIから取得した情報を正しく並べられずに困っています。

tmyk1979

総合スコア145

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2022/05/30 18:09

編集2022/05/30 18:10

前提

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で検証

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問