在 Swift4 中将获取的 XMPPframeWork vCards 保存到 CoreData

Posted

技术标签:

【中文标题】在 Swift4 中将获取的 XMPPframeWork vCards 保存到 CoreData【英文标题】:saving fetched XMPPframeWork vCards into CoreData in Swift4 【发布时间】:2018-08-11 07:05:09 【问题描述】:

我能够使用此代码创建和更新 vCard

    let xmppvCardStorage = XMPPvCardCoreDataStorage.sharedInstance()
    let xmppvCardTempModule = XMPPvCardTempModule.init(vCardStorage:xmppvCardStorage!)
    xmppvCardTempModule.activate(self.stream)
    xmppvCardTempModule.addDelegate(self, delegateQueue: DispatchQueue.main)
    let vCard = DDXMLElement(name: "vCard", xmlns: "vcard-temp")
    let vCardTemp = XMPPvCardTemp.vCardTemp(from: vCard)
    vCardTemp.nickname = "john"
    vCardTemp.jid = XMPPJID(string: "john123@www.example.com")

我还能够使用以下代码获取该 vCard:

    let xmppvCardStorage = XMPPvCardCoreDataStorage.sharedInstance()
    let xmppvCardTempModule = XMPPvCardTempModule.init(vCardStorage: xmppvCardStorage!)
    xmppvCardTempModule.activate(self.stream)
    let jID = XMPPJID(string: "john@www.example.com")
    xmppvCardTempModule.addDelegate(self,delegateQueue:DispatchQueue.main)
    xmppvCardTempModule.fetchvCardTemp(for: jID!, ignoreStorage:false)

如您所见,我正在从服务器获取 vCard。这是通过将ignoreStorage 设置为false 来完成的

我的问题是 XMPPFrameWork 是否支持将检索到的 vCard 存储在 CoreData 中,这样我就不必每次都检索它

【问题讨论】:

【参考方案1】:

fetchvCardTemp 仅获取给定 JID 的 vCardTemp(如果它不在存储中)。当您将 ignoreStorage 设置为 false 时,您是在说我不想使用存储并且我想通过XMPP 流。 您应该只使用 xmppvCardStorage 和其中一个名为 vCardTempForJID 的函数,然后只需传递您最喜欢的 jID,它就会返回给您

【讨论】:

我将其设置为 false 因为当我将其设置为 true 时没有返回任何内容。另外,我尝试了你所说的,但我没有得到任何东西是我的代码 sn-p:让 xmppvCardStorage= XMPPvCardCoreDataStorage.sharedInstance() xmppvCardStorage?.vCardTemp(for: jid, xmppStream: self.stream)。我的问题是 vCard 是否在检索时自动存储在 coreData 中,还是我必须将其保存在 XMPPvCard.xcdatamodeld 中 没有 XMPPFramework 在内部实现 coreData 但你可以自己实现它但不需要那个。在vCardTempForJID 有一个参数调用shouldFetch 你应该将它设置为true。因为在第一次尝试它是空的,框架必须通过网络获取它,但填充后你可以在任何地方使用它 感谢它工作得很好,只是一个快速的事情。如果 vcard 现在存储在我的 coreData 文件中。将忽略存储设置为 true 时,fetchVcard 方法不应该工作。如果不是这样,那么 fetchVcard 的用途是什么。谢谢 我不明白你的意思。ignoreStorage 如果你想让 fetchVcard 什么都不做,应该设置为 false。fetchVcard 的使用是当你不确定 vCard 是否更新时,你可以通过xmppStream 我的问题是我可以使用这个方法 fetchvCardTemp(for: jID!, ignoreStorage:false) 而不是 vCardTempForJID 方法。据我了解 fetchvCardTemp(for: jID!, ignoreStorage:false) 方法可以让用户检查 vcard 是否在存储中

以上是关于在 Swift4 中将获取的 XMPPframeWork vCards 保存到 CoreData的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 4 iOS 中将 Callkit 与 Agora VOiP 集成?

在 tableview 单元格中获取 coredata (swift4)

当我在 Xcode 11 中将 swift 4.2 转换为 swift 5 时继续加载

使用 alamofire 和 Swift4 IOS 获取 XML HTTP url 的响应

每秒获取 Swift4 SCNScene 30 个快照,并在 UIImageView 的外部屏幕上平滑绘制

推送通知点击获取 url 并在 View Controller , iOS , Swift4.2 中显示