你如何删除iOS中的PFObject?

时间:2014-04-30 04:36:36

标签: ios parse-platform

我不太明白whereKey,equalTo是如何工作的。

  • 我已阅读 Parse.com 上的文档及其他相关问题,但似乎并不了解如何关联和查找您要查找的对象。< / p>

  • 我想要做的是在一个人不喜欢之后删除PFObject(图像)。使用以下代码,我得到的Error没有与查询匹配的结果。

有人可以向我解释这个链接的工作原理吗?

已编辑的代码(现在正确运行):

- (IBAction)likeLook:(id)sender {

    if ([sender isSelected]) {
        [sender setImage:[UIImage imageNamed:@"Like.png"] forState:UIControlStateNormal];
        [sender setSelected:NO];
        NSData *imageData = UIImageJPEGRepresentation(imageFile.image, 1);
        [self deleteImage:imageData];

    } 
    else {
        [sender setImage:[UIImage imageNamed:@"Liked.png"] forState:UIControlStateSelected];
        [sender setSelected:YES];

        NSData *imageData = UIImageJPEGRepresentation(imageFile.image, 1);
        [self uploadImage:imageData];

        NSLog(@"Liked Image");

    }
}

-(void)deleteImage:(NSData *)imageData {

PFQuery *query = [PFQuery queryWithClassName:@"UserLikedPhoto"];

[query whereKeyDoesNotExist:@"likedImage"];

[query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
    if (!object) {
        NSLog(@"The getFirstObject request failed.");
    } else {
        NSLog(@"Successfully retrieved the object.");
        [object deleteInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
            if (succeeded && !error) {
                NSLog(@"Image deleted from Parse");
            } else {
                NSLog(@"error: %@", error);
            }
        }];
    }
}];


}
-(void)uploadImage:(NSData *)imageData {

    PFFile *likedImage = [PFFile fileWithName:@"Image.jpg" data:imageData];

    [likedImage saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (!error) {
            PFObject *userLikedPhoto = [PFObject objectWithClassName:@"UserLikedPhoto"];
            [userLikedPhoto setObject:likedImage forKey:@"likedLook"];

            userLikedPhoto.ACL = [PFACL ACLWithUser:[PFUser currentUser]];

            PFUser *user = [PFUser currentUser];
            [userLikedPhoto setObject:user forKey:@"User"];

            [userLikedPhoto saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                if (!error) {
                    NSLog(@"Saved");

                } else {
                    NSLog(@"Error: %@%@", error, [error userInfo]);
                }
            }];
        } else {
            NSLog(@"Error: %@%@", error, [error userInfo]);
        }
    }];
}

1 个答案:

答案 0 :(得分:1)

您可能希望更改deleteImage:以接受objectId而不是NSData。你不能查询解析匹配的数据博客(无论如何,我很确定,这是不好的做法)。

-(void)deleteImage:(NSString *)objectId {

PFQuery *query = [PFQuery queryWithClassName:@"UserLikedPhoto"];

[query getObjectInBackgroundWithId:objectId block:^(PFObject *object, NSError *error) {
    if (!object) {
        NSLog(@"The getFirstObject request failed.");
    } else {
        NSLog(@"Successfully retrieved the object.");
        [object deleteInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
            if (succeeded && !error) {
                NSLog(@"Image deleted from Parse");
            } else {
                NSLog(@"error: %@", error);
            }
        }];
    }
}];
}

在这种情况下,您甚至不需要查询的whereKey过滤器,因为我们正在寻找特定的对象。您可以将objectId存储在upload image下的saveInBackgroundWithBlock成功块中。我希望有所帮助。

修改

来自Parse PFFile文档:

  

您可以使用REST删除对象引用的文件   API。您需要提供主密钥才能被允许   删除文件。

     

如果您的文件未被应用中的任何对象引用,则不是   可以通过REST API删除它们。你可以要求一个   清除应用程序“设置”页面中未使用的文件。请记住   这样做可能会破坏依赖于访问的功能   未引用的文件通过其URL属性。文件是   当前与对象关联的不会受到影响。

我从未使用过Parse文件,但这对我来说似乎很奇怪。您必须使用万能钥匙删除文件,因此我不建议您在iOS应用中执行此操作。如果您愿意,可以创建一个云代码功能来处理删除,或者您可以删除UserLikedPhoto对象并定期请求清理文件。