草庐IT

swift - 根据选择的indexPath加载特定的json message_ids

coder 2023-09-08 原文

目标:
当我使用 didSelectRowAtMessageListController 的聊天消息列表中选择一条消息时,我希望下一个 ChatDetailController 中打开的聊天 session 匹配选择的同一对话。明显地。

我正在使用 WatchKit,但它在这个 iOS 图像中是一样的。与 Sophia 的消息被选中,与 Sophia 的聊天打开。
我想传递 json“message_id”,即我模型中的 chatMessageId 属性。我已经使用 presentController(withName: "ChatDetailController", context:消息上下文)

这里是使用 messageContext 打印出传递的数据。

Passed context: Optional(HTWatch_Extension.MessageModel(partner: "9859", nickname: "Marco", message: "Have you seen is dog?", city: "Madrid", countryBadgeImageURL: https://i.imgur.com/PJcyle7.jpg, messageListImageURL: https://i.imgur.com/PJcyle7.jpg, chatMessageId: "Tva9d2OJyWHRC1AqEfKjclRwXnlRDQ", status: "offline"))

下一步是什么? 我如何告诉 ChatDetailController 用与所选行匹配的对话填充它的表?

消息列表 Controller

// ...code...

let messageObject = [MessageModel]()
//var chatObject = [ChatModel]()

// ...code...

override func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int) {

    var messageContext = messageObject[rowIndex]
    var chatContext = chatObject[rowIndex]

    do {
        guard let fileUrl = Bundle.main.url(forResource: "Chats", withExtension: "json") else {
            print("File could not be located")
            return
        }
        let data = try Data(contentsOf: fileUrl)
        let decoder = JSONDecoder()

        let msg = try decoder.decode([ChatModel].self, from: data)
        self.chatObject = msg

    } catch let error {
        print(error)
    }

    // I got part of this line from a previous question, but these property types do not match.
    // No matter what chatObject I create I cannot access it/assign it. 
    // Also I do not want to mutate messageContext which Xcode is telling me to do.
    messageContext.chatMessageId = (chatObject as AnyObject).filter { (dictionaryTemp:[String:String]) -> Bool in
        return dictionaryTemp["message_id"] == chatContext.chatMessageId
    } 

    // WatchKit's model presentation method.
    presentController(withName: "ChatDetailController", context: messageContext)
}

聊天细节 Controller

var chats: [ChatModel] = []

    var messageModel: MessageModel? {
        didSet {
            guard let model = messageModel else { return }             
            partnerLabel.setText(model.nickname)             
        }
    }

    override func awake(withContext context: Any?) {
        super.awake(withContext: context)

        if let message = context as? MessageModel {

            self.messageModel = message
            print("Passed context: \(String(describing: messageModel))")
        } else {
            print("Passed context error: \(String(describing: context))")
        }

        do {
            guard let fileUrl = Bundle.main.url(forResource: "Chats", withExtension: "json") else {
                print("File could not be located")
                return
            }
            let data = try Data(contentsOf: fileUrl)
            let decoder = JSONDecoder()

            let msg = try decoder.decode([ChatModel].self, from: data)
            self.chats = msg

        } catch let error {
            print(error)
        }

        DispatchQueue.main.async(execute: {

            self.setupTable(chatMessageArray: self.chats as [AnyObject])
        })      
    }

聊天模型

public struct ChatModel: Codable {
// ... other properties
public var chatMessageId: String

enum CodingKeys: String, CodingKey {
    // ... other cases
    case chatMessageId = "message_id"
}

init (message:String , fromId:String, toID : String, imgUrl : URL?, chatMessageId : String) {
    // ... other properties
    self.chatMessageId = chatMessageId
   }    
  }
 // .... decoders etc
}

消息模型

public struct MessageModel: Codable {
    // ...
    public var chatMessageId: String

enum CodingKeys: String, CodingKey {
    // ... other cases
    case chatMessageId = "message_id"
}
// ... init/decoders etc
}

消息.json

[
  {
    "userid": "4444",
    "nickname": "Marco",
    "online_status": "offline",
    "message": "Have you seen his dog?",
    "city": "Madrid",
    "flag_url": "https://i.imgur.com/PJcyle7.jpg",
    "creationDate": "2016-02-22 15:18:40",
    "avatar_url": "https://i.imgur.com/PJcyle7.jpg",
    "message_id": "Tva9d2OJyWHRC1AqEfKjclRwXnlRDQ" // different id
  },
  {
      "userid": "12121",
      "nickname": "Tom",
      "online_status": "online",
      "message": "Where is the pizza shop?",
      "city": "Kyoto",
      "flag_url": "https://i.imgur.com/PJcyle7.jpg",
      "creationDate": "2016-02-22 15:18:40",
      "avatar_url": "https://i.imgur.com/PJcyle7.jpg",
      "message_id": "EnotMkk8REEd0DHGvUgnd45wBap80E" // different id
  }
]

聊天记录.json

2 个对话,每个对话包含 2 条消息。每个对话都有一个唯一的 fromId(伙伴)、toID(我自己)和唯一的 message_id

[
  {
    "fromId": "zz1234skjksmsjdfwe2zz",
    "toId": "qq43922sdkfjsfmmxdfqq",
    "messageText": "Have you seen is dog?",
    "imageUrl": "https://i.imgur.com/PJcyle7.jpg",
    "message_id": "Tva9d2OJyWHRC1AqEfKjclRwXnlRDQ", // conversation 1  - same message id as the 1st message in Messages.josn with nickname Marco.
    "read": "true"                                      
  },
  {
      "fromId": "zz1234skjksmsjdfwe2zz",
      "toId": "qq43922sdkfjsfmmxdfqq",
      "messageText": "Yes I have. It's cute.",
      "imageUrl": "https://i.imgur.com/PJcyle7.jpg",
      "message_id": "Tva9d2OJyWHRC1AqEfKjclRwXnlRDQ", // conversation 1
      "read": "true"
  },
  {
      "fromId": "bb888skjaaasjdfwe2333",
      "toId": "qq43922sdkfjsfmmxdfqq",
      "messageText": "What kind of pizza do you want?",
      "imageUrl": "https://i.imgur.com/PJcyle7.jpg",
      "message_id": "EnotMkk8REEd0DHGvUgnd45wBap80E", // conversation 2 - same message id as the 2nd message in Messages.josn with nickname Tom.
      "read": "true"
  },
  {
      "fromId": "bb888skjaaasjdfwe2333",
      "toId": "qq43922sdkfjsfmmxdfqq",
      "messageText": "I like ham & pineapple pizza.",
      "imageUrl": "https://i.imgur.com/PJcyle7.jpg",
      "message_id": "EnotMkk8REEd0DHGvUgnd45wBap80E", // conversation 2
      "read": "true"
  }
]

最佳答案

let msg = try decoder.decode([ChatModel].self, from: data)
self.chats = msg

您正在将 Chats.json 中包含的所有聊天数据存储到 chats 属性中。

要过滤聊天,请尝试像下面这样替换第二行

self.chats = msg.filter { chat in
    return chat.chatMessageId == self.messageModel.chatMessageId
}

或者,虽然我不知道为什么所有聊天都包含在单个 json 文件中,但最好将 json 文件分成多个文件用于每个聊天,如 Chat-Tva9d2OJyWHRC1AqEfKjclRwXnlRDQ.json

希望对您有所帮助。

关于swift - 根据选择的indexPath加载特定的json message_ids,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55671729/

有关swift - 根据选择的indexPath加载特定的json message_ids的更多相关文章

  1. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  5. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  6. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  7. Ruby - 如何在读取文件时跳过/忽略特定行? - 2

    在读取/解析文件(使用Ruby)时忽略某些行的最佳方法是什么?我正在尝试仅解析Cucumber.feature文件中的场景,并希望跳过不以Scenario/Given/When/Then/And/But开头的行。下面的代码有效,但它很荒谬,所以我正在寻找一个聪明的解决方案:)File.open(file).each_linedo|line|line.chomp!nextifline.empty?nextifline.include?"#"nextifline.include?"Feature"nextifline.include?"Inorder"nextifline.include?

  8. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  9. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  10. ruby - 如何根据长度将路径数组转换为嵌套数组或散列 - 2

    我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa

随机推荐