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

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

新規登録して質問してみよう
ただいま回答率
85.49%
YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

3210閲覧

swift firestore 配列データの取得について

nyansuke373

総合スコア7

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/10/01 09:42

編集2020/10/02 01:09

swift firestoreのデータ取得について質問をさせていただきます。
【実現したいこと】簡単な動画再生アプリを作成しております。お気に入りの動画のvideoIdをfirestoreに保存までしていて、お気に入り画面で保存したvideoIdを用い、お気に入りにした動画を見れるようにしたいと思っております。
【不明点】
①firestoreから保存したvideoIdの取得方法。
環境 xcode12 iOS14
よろしくお願いいたします。
参考にしたドキュメント
リンク内容
firestore
![firestore]
コード
イメージ説明

質問内容を変更しました。
これで重複はしておりません。下記加筆修正依頼に答える形となっております。

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

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

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

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

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

TsukubaDepot

2020/10/01 15:14

StackOverflowにもマルチポストされているようですね。 https://ja.stackoverflow.com/questions/70871/swift-firestore-%e2%91%a0%e9%85%8d%e5%88%97%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ae%e5%8f%96%e5%be%97-%e2%91%a1%e3%81%9d%e3%81%ae%e5%be%8c%e5%8f%96%e5%be%97%e3%83%87%e3%83%bc%e3%82%bf%e3%81%a7api%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e3%82%92%e3%81%97%e3%81%9f%e3%81%84 StackOverflowはマルチポストそのものは禁止されていないようですが、「マルチポストした理由を明記する」ことは推奨されているようです。 「質問時に他の質問サービスとのマルチポストを明示する必要はありますか?」 https://ja.meta.stackoverflow.com/questions/2246/%e8%b3%aa%e5%95%8f%e6%99%82%e3%81%ab%e4%bb%96%e3%81%ae%e8%b3%aa%e5%95%8f%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%a8%e3%81%ae%e3%83%9e%e3%83%ab%e3%83%81%e3%83%9d%e3%82%b9%e3%83%88%e3%82%92%e6%98%8e%e7%a4%ba%e3%81%99%e3%82%8b%e5%bf%85%e8%a6%81%e3%81%af%e3%81%82%e3%82%8a%e3%81%be%e3%81%99%e3%81%8b 一方、ここ teratail ではマルチポストは「非推奨」と明示してあります。 「他のサービスにも質問投稿をしたい(してしまった) teratailでは、マルチポスト※の推奨はしていません。」 https://teratail.com/help ただ、双方のガイドラインを見ていただければ分かる通り、「マルチポストをしている」「マルチポストをした理由は次の通りである」「解決したら、残りのサイトは自己解決させることで知識の共有をはかる」とありますから、双方のガイドラインに従っていただいた方がいいかと思います。
nyansuke373

2020/10/02 01:18

質問内容を変更しました。 これで重複はしておりません。下記加筆修正依頼に答える形となっております。
guest

回答2

0

自己解決

自己解決いたしました。documentのdataの中にある"videoId"を配列として取得、for文で取得したvideoIdを順番にAPIリクエストをかけて、結果を取得しました。回答いただき、ありがとうございました。

Swift

1//FireStoreのvideoIdを配列に格納 2private var videoIds: [String] = [] 3 4//firestoreのvideoIdを取得 5private func fetchFirestoreVideoId(){ 6 7 guard let uid = Auth.auth().currentUser?.uid else { return } 8 let userRef = Firestore.firestore().collection(Const.UserPath).document(uid) 9 10 userRef.getDocument { [self] (document, error) in 11 if let document = document, document.exists { 12 let userDic = document.data() 13 14 //documentのdataの中にある"videoId"を配列として取得 15 if let videoIds: [String] = userDic!["videoId"] as? [String] { 16 // videoIdsの要素であるvideoIdを取り出しAPIリクエスト 17 for videoId in videoIds { 18 //取得したvideoIdをもとにYoutube検索情報を取得 19 fetchYoutubeSerachInfo(videoId: videoId) 20 } 21 } 22 } else { 23 print("Document does not exist") 24 } 25 } 26}

投稿2020/10/04 17:03

nyansuke373

総合スコア7

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

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

0

Firestore を実際にいじれる環境ではないので、擬似的なコードでの実装例ですが、このような感じになるとおもいます(擬似的なコードですが、以下のコードそのものは Playground でも実行できます)。

Swift

1import UIKit 2 3var videoIds: [String] = [] 4 5func fetchFirestoreVideoId() { 6 // usreRef.getDocument の代わり 7 // 1秒後にデータベースからレスポンスが来たと仮定 8 DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { 9 // 実行結果から推測した仮想的なデータ 10 let dataDescription = ["videoId": NSArray(array: ["vRsbUlPmjqY", "zNO0kxTClYo", "EW02WW4yTRU"])] 11 12 print("Document data: (dataDescription)") 13 14 // NSArray を Array にダウンキャストする 15 if let array = dataDescription["videoId"] { 16 videoIds = array as? [String] ?? [] 17 } 18 19 print("(1)inside closure:", videoIds) 20 } 21 print("(2)outside closure:", videoIds) 22} 23 24// 実行 25fetchFirestoreVideoId()

ただし、気をつけなければいけないのはvideoIds への代入タイミングです。
usreRef.getDocument に渡しているクロージャは、実際は非同期処理となるため、クロージャ外でデータを処理しようとしても思ったような処理になりませんのでご注意ください。

Console

1(2)outside closure: [] 2Document data: ["videoId": <__NSArrayI 0x6000014c73c0>( 3vRsbUlPmjqY, 4zNO0kxTClYo, 5EW02WW4yTRU 6) 7] 8(1)inside closure: ["vRsbUlPmjqY", "zNO0kxTClYo", "EW02WW4yTRU"]
  • 出力順序が(2)->(1)になっている点に注意。

投稿2020/10/02 08:12

編集2020/10/02 08:12
TsukubaDepot

総合スコア5086

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問