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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

解決済

[Swift]Custom Classの配列重複バグ

ishiishiyay
ishiishiyay

総合スコア0

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

1回答

0評価

0クリップ

10閲覧

投稿2019/09/28 10:41

みなさま、下記、お力添え頂けますと幸いです... 1ヶ月立ち往生しています...

前提

LINEのようなメッセージングアプリを作っています。
Firebaseから該当メッセージを取得してカスタムクラスのmessages配列に入れています。

Swift

class Message { private var _senderId = ""; private var _url = ""; private var _timeStamp: NSNumber = 1 private var _toId = ""; private var _childkey = ""; private var _listened = false //クラスを初期化 init(senderId: String, url: String, toId: String, timeStamp: NSNumber , childkey: String, listened: Bool) { _senderId = senderId; _url = url; _toId = toId _timeStamp = timeStamp _childkey = childkey _listened = listened // 13classes and objects 14 initializers } var senderId: String? return _senderId; } var url: String? { return _url; } //中略 }

Aくん、Bくんのの二人とのトークがあり、Aくんとのメッセージ数は18個、Bくんとのメッセージ数は10個です。

Aくん、BくんのそれぞれのトークルームのView ControllerのViewdidappearの中で、messages.countを出力すると、それぞれ18と10が出力され、画面上でも同数のセルが表示されています。

Swift

override func viewDidAppear(_ animated:Bool) { print(self.messages.count) //Aくんのトークルームに入ったら18, Bくんのときは10 } ```### 問題点 ここからが非常に困っている箇所です。 別途、iPhone上部のセンサーを覆い隠すとトリガーされる処理を書いています。 ```Swift @objc func proximitySensorStateChanged(){ print(self.messages.count)     //中略:音声メッセージを再生する処理が続く }

ここで、Aくんのトークルームに入った状態でiPhone上部のセンサーを手で隠し、proximitysensorを実際に発動させます。print(self.messages.count)は18と出力されます。ここまでは問題ありません。一度Aくんのトークを出て、Bくんのトークに入りなおします。この状態でproximitysensorを発動させると、print(messages.count)は、18と10が連続で出力されます。先ほどまで入っていた方のトークルームの情報がなぜか残っています。

順番としてまず18を出力してから10を出力されます。確かに音声メッセージを聞いてみても、先にAくんのメッセージが流れ初めて、途中ですぐかぶせる形でBくんの音声が流れ始めます。message配列の箱が二つ作成されるのかと思います。

print(messages.count)という全く同じ処理をしているにも関わらず、proximitysensorの箇所で書くと異なるアウトプットとなってしまうのが不可解です。

ここでは音声再生処理の詳述は避けますが、上記により、Bくんの音声メッセージが聞きたいのに、同時に関係のないAくんのメッセージも流れてしまうという支障が生じています。

参考

Firebaseからメッセージ情報を取得して配列を作る処理は下記の通りです。
各友達との個別トークのViewControllerの中で書いています。
一番下に、proximitysensorに繋げるselectorも記載しています。

Swift

var messages = [Message]() //override func viewDidLoad()の中 Database.database().reference().child("user-messages").child(uid!).observe(.childAdded, with: { (snapshot) in let messageId = snapshot.key DBProvider.Instance.mediaMessagesRef.child(messageId).observe(.value, with: { (snapshot) in if let d = snapshot.value as? [String:AnyObject]{ if let url = d["url"] as? String { let senderId = d["sender_id"] as? String let toId = d["toID"] as? String let childkey = d["childkey"] as? String let listened = d["listened"] as? Bool let timeStamp = d["timeStamp"] as? NSNumber let newContact = Message(senderId: senderId!, url: url, toId: toId!, timeStamp: timeStamp! , childkey: childkey!, listened: listened!); //自分が送ったボイスかつ、送り先がContactsVCで選んだ友達のとき。 if senderId == (Auth.auth().currentUser?.uid)! && toId! == self.toID { self.messages.append(newContact); } //友達が送ったボイスかつ、送り先が自分 else if senderId == self.toID && toId == Auth.auth().currentUser?.uid { self.messages.append(newContact); } else { } //自分からそれ以外に送ったボイスや、友達が自分以外に送ったボイスはスルーする。 self.messages.sort(by: {Double($0.timeStamp!) < Double($1.timeStamp!)}) } } }, withCancel: nil) }, withCancel: nil) NotificationCenter.default.addObserver(self, selector: #selector(ChatVC.proximitySensorStateChanged), name: UIDevice.proximityStateDidChangeNotification, object: nil)

以上となります。もし何かお気付きの点がございましたら、コメント頂けますと大変幸いです。お手数ですが、よろしくお願いいたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。