【问题标题】:How can I notify client side so that a certain post does not exist anymore?如何通知客户端以使某个帖子不再存在?
【发布时间】:2018-02-05 02:31:54
【问题描述】:

我制作的应用是基于帖子/线程的。每次客户提交帖子时,所有其他客户都会在刷新tableview 时收到该帖子。然后使用核心数据保存新收到的帖子。最终,对于每个刷新的客户端,都会调用函数fetchPostsfetchPost 是一个异步函数,它会返回两次回调。首先,当它接收到来自核心数据的帖子时,然后当服务器同步完成并接收到实时数据时。

这个函数的问题是它总是会在第一个回调中返回所有帖子,包括被删除的帖子(被其他客户端删除)。

什么是处理这个问题的正确方法?这是我的代码:

static func fetchPosts(lastPost:Topic?,subject:String,complition: @escaping (_ topics:[Topic?],_ newData:Bool)->()){

        var topics:[Topic?] = []

        //Check Ceche. FIRST PART
        do {
            let fetchRequest : NSFetchRequest<DPost> = DPost.fetchRequest()
            fetchRequest.fetchLimit = 20
            if lastPost == nil {
                fetchRequest.predicate = NSPredicate(format: "created < %@ AND subject = %@ ", NSDate(),subject)
            }else{
                fetchRequest.predicate = NSPredicate(format: "created < %@ AND subject = %@", argumentArray: [lastPost?.date as Any, subject])
            }

            let fetchedResults = try context.fetch(fetchRequest)
            // _ = index
            for (_, aPost) in fetchedResults.enumerated() {

                topics.append(Topic(id: aPost.id!, title: aPost.title!, date: aPost.created! as Date, image: aPost.imageAddress, posterUsername: aPost.username!, posterUserid: aPost.userId!,posterImage: aPost.posterImageAddress))
                //TODO: add subject id
            }
        }
        catch {
            print ("fetch task failed", error)
        }
        //First Callback
        complition(topics,true)

        //Second part
        //Check server.
        topics = []
        var data:[String:Any] = [:]
        data[K.UserInformation.sessionID] = User.currentUser!.sessionID
        data[K.UserInformation.udid] = User.currentUser?.udid
        if topics.last == nil {
            data[K.TopicInformation.data] = "000000000000000000000000"
        }  else  {
            data[K.TopicInformation.data] = lastPost?.id
        }
        data[K.TopicInformation.subject] = subject
        HTTPRequest.appSession.data_request(url_to_request: K.Server.domain+":8443/getPosts",method: HTTPRequest.HTTPRequestMethod.post, data: HTTPRequest.toJSON(dict: data)) { (resStr:String?) in
            // return respond with information about the registrant status.
            if resStr != nil{
                let respond = HTTPRequest.toDict(jsonStr: resStr!)
                if (respond[K.Status.success] != nil){
                    let postDictList = respond[K.Status.success] as! [[String:Any]]
                    if postDictList.count == 0  {
                        //Second callback
                        complition(topics,true)
                        return
                    }
                    for dict in postDictList  {
                        let formatter = DateFormatter()
                        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

                        var topic:Topic? = nil
                        if let date = formatter.date(from: dict[K.TopicInformation.date] as! String) {
                            context.mergePolicy = NSOverwriteMergePolicy
                            let cPost = NSEntityDescription.insertNewObject(forEntityName: "CDPost", into: context) as! DPost
                            cPost.id = dict[K.TopicInformation.id] as? String
                            cPost.title = dict[K.TopicInformation.title] as? String
                            cPost.created = date as NSDate
                            cPost.imageAddress = dict[K.TopicInformation.postImageAddress] as? String
                            cPost.username = dict[K.TopicInformation.posterUsername] as? String
                            cPost.userId = dict[K.TopicInformation.posterUserid] as? String
                            cPost.posterImageAddress = dict[K.TopicInformation.posterImageAddress] as? String
                            cPost.subject = dict[K.TopicInformation.subject] as? String
                            do{
                                try context.save()
                            }
                            catch{
                                fatalError("Failure to save context: \(error)")
                            }

                            topic = Topic(id: dict[K.TopicInformation.id] as! String,
                                          title: dict[K.TopicInformation.title] as! String,
                                          date: date,
                                          image: dict[K.TopicInformation.postImageAddress] as? String,
                                          posterUsername: dict[K.TopicInformation.posterUsername] as! String,
                                          posterUserid: dict[K.TopicInformation.posterUserid] as! String, posterImage: dict[K.TopicInformation.posterImageAddress] as? String)
                        }
                        topics.append(topic!)
                    }
                    complition(topics,true)
                    return
                }

                if(respond[K.Status.error] != nil){
                    print(respond["errmsg"] as! String)
                }
            }

服务端是用 NodeJS 写的 Mongodb 是我用的数据库。让我知道它是否相关,以便可以编辑出/在某些标签中。

【问题讨论】:

    标签: ios node.js swift core-data client-server


    【解决方案1】:

    如果你有获取限制,我认为你不能通过比较获取的帖子和存储在 CoreData 中的帖子在本地进行,最好是在帖子中添加一个unread 标签并在获取时使用你的 API 更新它然后可以使用unread 标签获取已删除和正常的帖子,另一个想法是使用上次登录时间并获取该时间的所有帖子,包括已删除的帖子

    【讨论】:

    • 有意思,谢谢!生病等待更多解决方案的想法。如果没有人有更好的主意,我会标记为解决方案。
    • 如果你可以点赞这篇文章,我想发布一些问题,但是因为我有很多帖子,点赞数为 0,所以我无法发布任何内容...
    猜你喜欢
    • 2017-06-25
    • 1970-01-01
    • 2019-07-08
    • 2018-01-31
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多