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

    下面是我的课堂结构如何(简化):

    用户:

  • postLikes(关系)
  • 帖子:

  • 作者(PFObject)
  • likesCount(Int)
  • 我也喜欢/不喜欢逻辑到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

    上一篇: How to prevent Parse from saving PFObject children's?

    下一篇: Can placement new survive optimization, unlike memset?