
###前提・実現したいこと
アプリを開発中にログイン機能を実装しています。(サーバーは実装済み)
その際に、ログインした後しかメッセージの情報を取得できないのですが
Alamofireを利用して「ユーザー情報登録要求(この処理の最後にログイン処理を実行)」「ログイン処理」「メッセージ数取得」の順番で実行すると
「メッセージ数取得」のレスポンスが先に返ってきてしまい"ログインされていない"エラーになってしまいます。
アプリ起動直後の画面でメッセージ数を表示したいので、ログイン処理の最後にメッセージ数取得の処理を行うと、
画面の更新ができないと思うのですが、どのように実装すればうまくいくでしょうか。
###該当のソースコード
Swift
1import UIKit 2 3class TopPage: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view, typically from a nib. 8 self.checkUserData() 9 } 10 11 private func checkUserData() { 12 if let data = Variable.getUserId() { 13 userID = data 14 KeyManager.publicKey = KeyManager.findKeyString(keyTag: publicKeyData) 15 UserAPI.userLogin() 16 UserAPI.checkMessage(result: { count in 17 print(count) //ここでエラー 18 /* 19 ログイン後にメッセージ数取得を行わないといけない、 20 かつ画面の更新も行いたい。 21 */ 22 }) 23 } else { 24 userID = NSUUID().uuidString 25 Variable.saveUserId() 26 _ = KeyManager.createKeyPairs() 27 KeyManager.publicKey = KeyManager.findKeyString(keyTag: publicKeyData) 28 UserAPI.userRegister() 29 UserAPI.checkMessage(result: { count in 30 print(count) //ここでエラー 31 /* 32 ログイン後にメッセージ数取得を行わないといけない、 33 かつ画面の更新も行いたい。 34 */ 35 }) 36 } 37 }
Swift
1import UIKit 2import SVProgressHUD 3import SwiftyJSON 4 5class UserAPI: NSObject { 6 7 static let server = "テストサーバー" 8 static var header = ["ヘッダーの内容"] 9 10 //ユーザー登録 11 class func userRegister() { 12 SVProgressHUD.show() 13 let param = ["user_id": userID, "public_key": KeyManager.publicKey!] 14 NetworkManager.shared.ApiManager().request(authRegister, method: .post, parameters: param).responseJSON { response in 15 guard let object = response.result.value else { print(".Error"); return } 16 SVProgressHUD.dismiss() 17 let json = JSON(object) 18 self.userLogin() 19 } 20 } 21 22 class func userLogin() { 23 SVProgressHUD.show() 24 let param = ["user_id": userID, "public_key": KeyManager.publicKey!] 25 NetworkManager.shared.ApiManager().request(authLogin, method: .post, parameters: param, headers: header).responseJSON { response in 26 guard let object = response.result.value else { print(".Error"); return } 27 SVProgressHUD.dismiss() 28 let json = JSON(object) 29 } 30 } 31 32 //メッセージ数確認 33 class func checkMessage(result: @escaping (Int) -> ()) { 34 SVProgressHUD.show() 35 NetworkManager.shared.ApiManager().request(checkMessage, method: .get, headers: header).responseJSON { response in 36 guard let object = response.result.value else { print(".Error"); return } 37 SVProgressHUD.dismiss() 38 let json = JSON(object) 39 let count = json["result"]["message_count"].int! 40 result(count) 41 } 42 } 43 44}
###試したこと
「ユーザー情報登録要求(この処理の最後にログイン処理を実行)」「ログイン処理」も
コールバック(入れ子のように)にしてしまえば実装は出来そうですが
それだとコードが見づらいものになってしまうかと思いまして。
他にスタイリッシュに記述する方法を教えていただけませんか?
###補足情報(言語/FW/ツール等のバージョンなど)
【swift3】【Xcode8.2.1】

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/14 04:04
退会済みユーザー
2017/04/14 04:15 編集
2017/04/14 05:04