Ios Can';在badoo/Chatto聊天文本上填充api数据时,不要访问alamofire请求范围之外的模型对象数据

Ios Can';在badoo/Chatto聊天文本上填充api数据时,不要访问alamofire请求范围之外的模型对象数据,ios,json,swift,chat,alamofire,Ios,Json,Swift,Chat,Alamofire,以前,我成功地访问了类中任何位置的模型对象,但在badoo/chatto文本视图中填充数据时,我被卡住了。 我正在将聊天信息api集成到badoo聊天视图中 基本上,问题是alamofire的响应没有超出范围 我是否尝试使用编译处理程序,但没有成功?有没有办法解决这个问题 提前谢谢 下面是代码片段: import Foundation import Chatto import ChattoAdditions import SwiftyJSON import Alamofire class De

以前,我成功地访问了类中任何位置的模型对象,但在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)
    }
}

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

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

请建议我使用编译处理程序正确地转换alamofire这是一个使用异步调用结果转换所有方法的示例。由于我从未使用过
Chatto
,并且您没有显示代码中的所有类型,因此您可能需要修改我的代码的许多部分,但我相信您可以看到您需要如何使用此代码

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)
        }
    }
}
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.
                //...
            }
        }
    }
}
您可能需要使用异步方法,如:

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

你是说完成处理程序和编译处理程序?如果您说确实尝试了,请使用完成处理程序显示代码。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)}如果让error=response.result.error作为错误?{completionhandler(nil,error)}}}并在函数DemoChatMessageFactory.getAllChatData{(result)中使用下面的方法调用在res=result print(“response(res)”)中,请向我推荐使用编译手柄的alamofire的正确方法。您最好对代码进行更好的格式化。无论如何,您能从
print(“response(res)”中获得输出吗
?似乎这已经成为添加注释的限制。无论如何,你只需要在完成处理程序中使用结果。如果你在
makeTextFinalMessage
中调用它,它需要有一个完成处理程序,而你的
makeMessageData
makeMessage
,所有这些东西都需要使用完成处理程序。谢谢为了帮助我,我解决了这个问题。Badoo pod限制访问外部值。我在Badoo类内部初始化了模型对象
DemoChatMessageFactory.requestMessage(uid) { (model, error) in
    if let model = model {
        //Do some UI updates using `model`...
    } else {
        //Do something for the error...
    }
}