如何防止Parse保存PFObject儿童?
我遇到了Parse和iOS的一个非常常见的问题。
我有一个具有以下结构的类POST :
text(String)
Image (PFFile)
LikesUsers (Array of String)
LikesCount (Int)
From (Pointer to User who posted it)
并且如果用户(已经登录)喜欢帖子。 我只是递增喜欢和增加用户Objectid阵列
例如:用户2喜欢用户1的帖子。
PostObject.incrementKey("Likes")
PostObject.addObject((PFUser.currentUser()?.objectId)!, forKey: "LikesUsers")
PostObject.saveEventually()
问题在这里。 只要它有一个指向另一个用户的指针(比登录的)我不能保存PostObject我收到错误:
除非已通过logIn或signUp进行身份验证,否则用户无法保存
那么如何防止保存ParseObject儿童(“From”)
我不想使用CloudCode,我想保持简单并使用SaveEventually以获得更好的用户体验。
来自parse.com论坛:
当您用指针保存对象时,Parse会查看整个对象并保存“脏”的字段(自上次保存后更改)。 它还检查指针指向的所有对象。 如果你的对象有一个指向PFUser的指针,并且PFUser的实例是“脏的”,那么Parse将保存该对象,然后尝试保存PFUser的实例。 我的假设是,在你的代码中的某个地方,你正在为用户设置一个值,然后不保存用户。 我怀疑这是你错误的根源。 仔细检查你的代码,找到你设置PFUser实例的任何地方,并确保有相应的保存。 如果乍看之下找不到它,请务必检查所有块,并确保不会异步污染用户并随后尝试保存它。
您是否试图对该帖子由用户进行更改?
简短的回答:
尝试from
字段设置为:
let author = PostObject["from"] as! PFObject
PostObject["from"] = PFObject(withoutDataWithClassName: "_User",
objectId: author.objectId)
这没有经过测试。
但我建议你改变架构
我面临着同样的问题,最后决定将likes
域移动到User
类,并使其成为Relation<Post>
类型。 解析文档说, Relation
类型对于保持很多对象来说更好。 由于LikesUsers
是一个对象数组,如果一个帖子会得到很多喜欢的话,性能可能会明显下降:该应用将下载所有喜欢这篇文章的用户。 有关更多信息,请参阅:https://parse.com/docs/ios/guide#objects-relational-data
下面是我的课堂结构如何(简化):
用户:
帖子:
我也喜欢/不喜欢逻辑到CloudCode功能:
/// The user liked or disliked the post.
Parse.Cloud.define("likeDislikePost", function(request, response) {
var userProfileId = request.params.userProfileId
var postId = request.params.postId
// Shows whether the user liked or disliked the post. Bool value
var like = request.params.like
var query = new Parse.Query("_User");
query.equalTo("objectId", userProfileId);
query.first({
success: function(userProfile) {
if (userProfile) {
var postQuery = new Parse.Query("Post");
postQuery.equalTo("objectId", postId);
postQuery.first({
success: function(post) {
if (post) {
var relation = userProfile.relation("postLikes");
if (like) {
relation.add(post);
post.increment("likesCount");
}
else {
relation.remove(post)
post.increment("likesCount", -1);
}
post.save();
userProfile.save();
console.log("The user with user profile id " + userProfileId + " " + (like ? "liked" : "disliked") + " the post with id " + postId);
response.success();
}
else {
response.error("Unable to find a post with such ID");
}
},
error: function() {
response.error("Unable to like the post");
}
});
}
else {
response.error("Unable to find a user profile with such ID");
}
},
error: function() {
response.error("Unable to like the post");
}
});
});
工作得很好。
我为你创建了一些项目。 我想你在创建PFClass时会错过一些东西。 我不知道。 无论看我的代码,
这是ViewController
,它包含如Button Action ;
import UIKit
class ViewController: UIViewController {
private let test = Test() // PFObject SubClass
private let post = Post() // PFObject SubClass
@IBAction func likeButton() {
self.test.fromUser = PFUser.currentUser() // Current User
self.test.likedUsers.append(Post().user // In there your post should be a Subclass of PFObject too like your this Test class and it should be contains Owner property. So you can grab the Post owner PFUser or User Object ID.)
self.test.saveEventually() {
(let success, error) in
if error == nil {
// Success
} else {
print(error?.localizedDescription)
}
}
}
}
在你的AppDelegate
初始化你的ParseSDK并注册你的新Parse子类。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
Parse.setApplicationId("YOUR_API_KEY", clientKey: "YOUR_CLIENT_KEY")
Test.registerSubclass()
Post.registerSubclass()
return true
}
测试子类 ;
import Foundation
import Parse
class Test: PFObject, PFSubclassing {
// Your Properties
@NSManaged var likedUsers: [PFUser]
@NSManaged var fromUser: PFUser
static func parseClassName() -> String {
return "Test" // Your Class Name
}
}
发布子类 ;
class Post: PFObject, PFSubclassing {
// Your Properties
@NSManaged var owner: PFUser
@NSManaged var likeCount: NSNumber
static func parseClassName() -> String {
return "Post" // Your Class Name
}
}
在我的情况下,它工作正常。 如果您遇到错误,请通知我。
有一个很好的编码。
链接地址: http://www.djcxy.com/p/90571.html