因此,我的任务是使用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查询的异步返回,我觉得我根本无法回到父循环中)...我还没有实现,因为我我即将放弃 - 必须有一个更好的方法!
我希望我在这里错过了一个策略......