代码之家  ›  专栏  ›  技术社区  ›  Vinayak Bhor

在badoo/Chatto聊天文本上填充api数据时,无法访问alamofire请求范围之外的模型对象数据

  •  0
  • Vinayak Bhor  · 技术社区  · 7 年前

    以前,我成功地访问了类中任何位置的模型对象,但在badoo/chatto文本视图中填充数据时,我被卡住了。 我正在将聊天信息api集成到badoo聊天视图中

    基本上,问题是alamofire的响应没有超出范围。

    我是否尝试使用编译处理程序,但没有成功?有没有办法解决这个问题?

    提前谢谢。

    以下是代码片段:

    import Foundation
    import Chatto
    import ChattoAdditions
    import SwiftyJSON
    import Alamofire
    
    class DemoChatMessageFactory {
        public static var chats = [ChatModel]()
    
        class func makeMessage(_ uid:String) -> DemoTextMessageModel{
            print("uid makeMessage : \(uid)")
            return self.makeMessageData(uid, isIncoming:false)
        }
    
        class func makeMessageData(_ uid: String,isIncoming:Bool) -> DemoTextMessageModel {
            if isIncoming == true{
                return self.makeTextFinalMessage(uid, isIncoming:isIncoming)
            } else {
                return self.makeTextFinalMessage(uid, isIncoming: isIncoming)
            }
        }
    
        public class func makeTextMessage(_ uid: String, isIncoming: Bool,text:String) -> DemoTextMessageModel {
            let messageModel = self.makeMessageModel(uid, isIncoming: isIncoming,
                                                     type: TextMessageModel<MessageModel>.chatItemType)
            let textMessageModel = DemoTextMessageModel(messageModel:messageModel,
                                                        text: text)
            return textMessageModel
        }
    
        public class func makeTextFinalMessage(_ uid: String, isIncoming: Bool) -> DemoTextMessageModel {
            var text = String()
            var uidInt  = Int(uid)
    
            print("string uid 121 \(uid)")
            print("print is Incomming data or not 1: \(isIncoming)")
            print("uid count :\(uid.count)")
            let urlString = "[My message Api]"
    
            Alamofire.request(urlString, method: .get).validate().responseJSON {
                (response) -> Void in
                if let value = response.data {
                    do {
                        let json = try JSON(data: value)
                        if let dictionnary = json.dictionaryObject {
                            if let messageArray = dictionnary["message"] as?[[String: Any]] {
                                self.chats.removeAll()
                                for arr in messageArray {
                                    self.chats.append(ChatModel(ChatListJSON: arr))
                                }
                            }
                        }
                    } catch {
                        print("cannot convert to Json")
                    }
                }
    
                print("print int 122 : \(uidInt!)")
                print("Chat List Id DemoChatMessageFactory \(self.chats[uidInt!].chatId)")
                print("chat message: \(String(describing: uidInt!)) th \(self.chats[uidInt!].chatMessage)")
                self.textData = "\(self.chats[uidInt!].chatMessage)"
    
                self.makeTextMessage(uid, isIncoming: isIncoming, text:self.textData) //Here I am bale to pass textData but ouside the Alamofire block can't access
            }
    
            //Here getting empty values
            print("uid makeTextFinalMessage \(uid)")
            print("in coming makeTextFinalMessage \(isIncoming)")
            print("text makeTextFinalMessage \(text)")
    
            //chat count also getting zero count
            print("chat count final text\(chats.count)")
    
            print("print chat count : \(self.chats.count)")
    
            return self.makeTextMessage(uid, isIncoming: isIncoming, text:self.textData)
        }
    }
    

    完成处理程序测试

    public var res: Any = ""
    func getAllChatData(completionhandler:@escaping ([String: Any]?) -> ()){
        let URL = "my api"
        Alamofire.request(URL).responseJSON {
            response in
            if let json = response.result.value as? [String: Any] {
                completionhandler(json, nil)
            }
            else if let error = response.result.error as Error? {
                completionhandler(nil, error)
            }
        }
    }
    

    并在函数内部使用下面的方法调用

    DemoChatMessageFactory.getAllChatData {
        (result) in
        res = result
        print("response (res)")
    }
    

    请建议我使用编译处理程序访问alamofire的正确方法

    1 回复  |  直到 7 年前
        1
  •  1
  •   OOPer    7 年前

    这是一个使用异步调用的结果转换所有方法的示例。因为我从来没有用过 Chatto 您并没有显示代码中的所有类型,因此您可能需要修改我的代码的许多部分,但我相信您可以看到您需要如何处理这些代码。

    import Foundation
    import Chatto
    import ChattoAdditions
    import SwiftyJSON
    import Alamofire
    
    class DemoChatMessageFactory {
        public static var chats = [ChatModel]()
    
        class func requestMessage(_ uid:String,
                               completion: @escaping (DemoTextMessageModel?, Error?)->Void) {
            print("uid makeMessage : \(uid)")
            self.requestMessageData(uid, isIncoming: false) { (model, error) in
                completion(model, error)
            }
        }
    
        class func requestMessageData(_ uid: String, isIncoming: Bool,
                                   completion: @escaping (DemoTextMessageModel?, Error?)->Void) {
            if isIncoming {
                //...put any code needed when isIncoming is true
                self.requestTextFinalMessage(uid, isIncoming: isIncoming) { model in
                    completion(model, error)
                }
            } else {
                //...put any code needed when isIncoming is false
                self.requestTextFinalMessage(uid, isIncoming: isIncoming) { model in
                    completion(model, error)
                }
            }
        }
    
        public class func makeTextMessage(_ uid: String, isIncoming: Bool, text: String) -> DemoTextMessageModel {
            let messageModel = self.makeMessageModel(uid, isIncoming: isIncoming,
                                                     type: TextMessageModel<MessageModel>.chatItemType)
            let textMessageModel = DemoTextMessageModel(messageModel:messageModel,
                                                        text: text)
            return textMessageModel
        }
    
        public class func requestTextFinalMessage(_ uid: String, isIncoming: Bool,
                                               completion: @escaping (DemoTextMessageModel?, Error?)->Void) {
            var text = String()
            var uidInt  = Int(uid)
    
            print("string uid 121 \(uid)")
            print("print is Incomming data or not 1: \(isIncoming)")
            print("uid count :\(uid.count)")
            let urlString = "[My message Api]"
    
            Alamofire.request(urlString, method: .get).validate().responseJSON {
                (response) -> Void in
                if let value = response.data {
                    do {
                        let json = try JSON(data: value)
                        if let dictionnary = json.dictionaryObject {
                            if let messageArray = dictionnary["message"] as?[[String: Any]] {
                                self.chats.removeAll()
                                for arr in messageArray {
                                    self.chats.append(ChatModel(ChatListJSON: arr))
                                }
                            }
                        }
    
                        print("print int 122 : \(uidInt!)")
                        print("Chat List Id DemoChatMessageFactory \(self.chats[uidInt!].chatId)")
                        print("chat message: \(String(describing: uidInt!)) th \(self.chats[uidInt!].chatMessage)")
                        self.textData = "\(self.chats[uidInt!].chatMessage)"
    
                        completion(self.makeTextMessage(uid, isIncoming: isIncoming, text: self.textData), nil)
                    } catch {
                        print("cannot convert to Json")
                        completion(nil, error)
                    }
                } else {
                    //better generate an error case result, and call completion.
                    //...
                }
            }
        }
    }
    

    我从更改了一些方法名称 make... request... 为了说明它们是异步方法。

    如果您打算将原始代码用作:

    let model = DemoChatMessageFactory.makeMessage(uid)
    //Do some UI updates using `model`...
    

    您可能需要使用异步方法,如:

    DemoChatMessageFactory.requestMessage(uid) { (model, error) in
        if let model = model {
            //Do some UI updates using `model`...
        } else {
            //Do something for the error...
        }
    }