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

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

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

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

Q&A

解決済

2回答

3989閲覧

【Swift】UITableViewの非同期更新処理について

ia_isier

総合スコア29

Swift

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

0グッド

0クリップ

投稿2015/07/16 02:29

編集2015/07/16 13:02

こんにちは。
閲覧いただきありがとうございます。

表題の通り、UITableViewの非同期更新処理についてつまずいています。
具体的には、

・UITableViewと同じ階層にUITextField,UIButtonを設置
・UITextFieldにコメントを入力し、UIButtonをタップすると入力した内容がWebAPIにPOSTされ、DBが更新される
・これまで入力された内容がUITableViewCellに表示される

といったものです。
DBの更新までは実装できたものの、1度画面を切り替えないとPOSTされた内容が表示されず悩んでいます。

API実行のNotification内でTableView.reloadData()を実行してみたものの上手く行きませんでした。

どなたか対処法をご存知のかた、ご教授いただけますと助かります。
よろしくお願いします。

【追記】
APIはCakePHPで用意しており、URLを指定してAlamofireでPOSTしています。
Cake側ではPOSTされたコメント内容をDBに格納しています。
APIを実行完了したタイミングでNotificationで通知を出し、そのタイミングでTableView.reloadData()を実行してもテーブルを再描画することができませんでした。

【再追記】
Notification付近のコードは以下のとおりです。
(エラーハンドリング周りは参考書からそのまま引っ張ってきています…)
上記のUIButtonをタップした際に呼び出しているメソッドになります。
sendData()メソッドでAPIを叩いてDBに保存する形になります。
DBの値はviewWillAppear()内で最初にAPIを通して取得しています。
TableView.reloadData()メソッドの使い方を勘違いしていて、
この実装では新しくDBの値を取得できていない、ということでしょうか…?

お手数おかけして恐縮ですが、よろしくお願いします。

swift

1func onClickSendButton(sender: UIButton) { 2 3 var qc = PostCommentQueryCondition() // POSTする際のパラメータ 4 var comment: String = self.editField.text 5 6 qc.comment = comment 7 8 postCommentAPI = PostCommentAPI(condition: qc) 9 postCommentAPI.sendData() 10 11 postCommentObserver = NSNotificationCenter.defaultCenter().addObserverForName( 12 postCommentAPI.PostCommentAPISendCompleteNotification, 13 object: nil, 14 queue: nil, 15 usingBlock: { 16 (notification) in 17 18 self.editField.text = "" 19 self.myTableView.reloadData() 20 self.hideKeyBoard() 21 22 // エラーがあればダイアログを開く 23 if notification.userInfo != nil { 24 if let userInfo = notification.userInfo as? [String: String!] { 25 if userInfo["error"] != nil { 26 let alertView = UIAlertController( 27 title: "通信エラー", 28 message: "通信エラーが発生しました", 29 preferredStyle: .Alert) 30 alertView.addAction( 31 UIAlertAction(title: "OK", style: .Default) { 32 action in return 33 } 34 ) 35 self.presentViewController(alertView, animated: true, completion: nil) 36 } 37 } 38 } 39 40 }) 41 42 43 }

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

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

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

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

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

Stripe

2015/07/16 03:22

API実行のNotificationって何ですか?
ia_isier

2015/07/16 04:17

説明不足で申し訳ありません。追記しました。
Stripe

2015/07/16 08:32

それで、更新後のDBはどのタイミングでダウンロードしていますか?
rifuch

2015/07/16 08:44

Notification通知を受け取ったあたりのソースを頂けると、アドバイスしやすいかもしれません。
ia_isier

2015/07/16 13:02

要領を得ない回答ですみません。再度追記しました。
guest

回答2

0

ベストアンサー

「DBの値はviewWillAppear()内で最初にAPIを通して取得しています。」というのが、原因です。
そのため、「1度画面を切り替えないとPOSTされた内容が表示されず悩んでいます。」という状況になります。

DBを更新した都度、DBの値を取得しなおしてください。
そうしないと、TableView.reloadData()を実行してもDBの内容が反映されません。

投稿2015/07/16 15:29

Stripe

総合スコア2183

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

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

ia_isier

2015/07/16 22:10

DBを再取得するように変更したところ無事に動作しました! 考えてみれば当たり前のことでしたね…お恥ずかしい限りです。 わかりやすく丁寧なアドバイス、ありがとうございました!
guest

0

tableViewDataSourceの更新がpostCommentAPI.PostCommentAPISendCompleteNotificationできちんと行われていることを前提として、

postCommentAPIとpostCommentObserver,postCommentObserverにNotificationCenterのオブザーバーを指定するところが良くない気がしますクリックイベントのメソッドではなく、それ以前に準備ができている必要があるのではないでしょうか?

postCommentAPIとpostCommentObserverをプロパティか何かにして、viewDidLoadあたりでオブザーバーにセットしてみるのはどうでしょうか?

onClickSendButtonではpostCommentAPIの再設定とsendData()のみをすると。

ちょっと自信がありませんが。外していたらすみません。

投稿2015/07/16 14:31

rifuch

総合スコア1901

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

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

ia_isier

2015/07/16 22:11

確かに見通しが悪くなっているような気もします。 もう少しコードを綺麗に書くように気をつけたいと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問