当前位置:  开发笔记 > IOS > 正文

parse.com'转发'模式太冗长了

如何解决《parse.com'转发'模式太冗长了》经验,为你挑选了0个好方法。

因此,我的任务是使用Parse在应用程序(iOS,Swift)中实现类似"转推"的功能.

这是在此之前被问到的,但这是a)非常高级别的b)我得到了手头的任务 - 我不一定在建筑决策上寻求帮助,但如果看起来我显然错过了什么,我'我乐意接受反馈.

我的应用程序有CAUSES,每个都由USER创建.还有一个带有TO和FROM用户的FOLLOW表.首先,我只是查询CAUSES表,其中发布的USER应该与FOLLOW表中TO用户的objectId(当前用户是FROM用户)匹配.更简洁:

let getFollowedUsersQuery = PFQuery(className: Constants.kParseClassFollowers)
getFollowedUsersQuery.whereKey(Constants.kParseFieldFromUser, equalTo: PFUser.currentUser()!)

let causesQuery = PFQuery(className: Constants.kParseClassCauses)
causesQuery.whereKey(Constants.kParseFieldFromUser, matchesKey: Constants.kParseFieldToUser, inQuery: getFollowedUsersQuery)
causesQuery.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
    if let causes = objects {
        for cause in causes {
          // populate the tableview cells, etc.
        }
    }
})

现在我有来自用户的所有原因,我遵循...这都是非常标准的.

这是它变得棘手的地方.
每个CAUSE也有一个名为SUPPORTERS的Relation.现在我需要构建一种方法来从我不遵循的人那里获得所有CAUSES,但是在他们的支持者列表中有我关注的用户.

我还没有找到一个优雅的解决方案,虽然我正在接近一个"蛮力"的解决方案,它是如此繁琐和冗长,以至于我的程序员大脑中更好的一半像Susan Powter一样尖叫着 ......

这是一个示例:

let retweetQuery = PFQuery(className: Constants.kParseClassCauses)
retweetQuery.orderByDescending(Constants.kParseFieldCreatedAt)
retweetQuery.whereKey(Constants.kParseFieldFromUser, notEqualTo: PFUser.currentUser()!)
retweetQuery.whereKey(Constants.kParseFieldFromUser, doesNotMatchKey: Constants.kParseFieldToUser, inQuery: getFollowedUsersQuery)
retweetQuery.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
    if let causes = objects {
        for cause in causes {
            let supporterRelations = cause.relationForKey(Constants.kParseClassSupporters)
            let supporterQuery = supporterRelations.query()
            supporterQuery.findObjectsInBackgroundWithBlock { (supporters, error) in
                if(error == nil && supporters?.count > 0) {
                    for supporter in supporters! {
                        let user:PFUser = supporter as! PFUser
                        getFollowedUsersQuery.whereKey(Constants.kParseFieldToUser, equalTo: user)
                        getFollowedUsersQuery.whereKey(Constants.kParseFieldFromUser, equalTo: PFUser.currentUser()!)
                        getFollowedUsersQuery.findObjectsInBackgroundWithBlock({ (results, error) -> Void in
                            if(error == nil && results?.count > 0) {
                                for result in results! {
                                    // do stuff
                                }
                            }
                        })
                    }
                }
            }
        }
    }
})

现在,这是纯粹的疯狂,并且令人难以置信的浪费(特别是考虑到Parse如何计算免费等级 - 我觉得如果将其推向生产,这可能会对我的API限制造成很大影响).

已完成两个查询,我完全重做一个,然后对SUPPORTER Relations上的每个原因执行另一个查询,然后对该关系中的每个用户执行另一个查询,看看我是否遵循它们......一旦我有了这些信息,我需要遍历用户支持的原因(由于Parse查询的异步返回,我觉得我根本无法回到父循环中)...我还没有实现,因为我我即将放弃 - 必须有一个更好的方法!

我希望我在这里错过了一个策略......

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有