如何防止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