我想创建一个具有自定义Object Id的对象。我想这样做的原因是因为如果尝试创建具有相同数据的行,我希望save方法失败。例如:如果您尝试使用已经拍摄的电子邮件注册,则Parse会自动无法保存。对于非User类的类中的数据,我希望发生同样的事情。
或者,如果我知道如何做到这一点,我可以让事情发挥作用
if(class contains column with "this string of data"){
do nothing}
else{
save "this string of data"}
我正在做的是实施一个向上投票和向下投票的系统,我不希望用户能够在一个帖子上多次投票。
每次用户投票时,它都会进入解析一行数据的行,该列的字符串类型将是post + voter的内容。所以如果post + voter的内容组合会再次尝试保存,我希望它失败。 这是tableview中单元格的代码。这是downVote代码。 (upVote代码非常相似)
//intVotes goes into a label with the amount of votes
//thisReview contains the content of the post
//downVote() increments number of votes by -1 in Parse
@IBAction func downVote(sender: AnyObject) {
var reviewQuery: PFQuery = PFQuery(className: "reviews")
reviewQuery.whereKey("content", equalTo: reviewTextView.text)
reviewQuery.findObjectsInBackgroundWithBlock{
(objects:[AnyObject]!, error:NSError!)->Void in
if error == nil{
for object in objects{
let review:PFObject = object as! PFObject
self.defaults.setValue(review["content"], forKey: "thisReview")
}
}
}
var vote:PFObject = PFObject(className: "votes")
if String(stringInterpolationSegment: vote.valueForKey("votes")) != String(stringInterpolationSegment: defaults.valueForKey("thisReview")) + String(stringInterpolationSegment: PFUser.currentUser()){
vote.setValue(String(stringInterpolationSegment: defaults.valueForKey("thisReview")) + String(stringInterpolationSegment: PFUser.currentUser()), forKey: "objectId")
vote.saveInBackgroundWithBlock {
(succeeded: Bool, error: NSError!) -> Void in
if error == nil {
self.downVote()
var intVotes: Int = self.votes.text!.toInt()!
intVotes = intVotes - 1
self.votes.text = "\(intVotes)"
} else {
println ("Failed")
}
}
}
else{
//do nothing
}
}
这个ALMOST有效,除了if语句中的等式左边(vote.valueForKey部分)每次都返回nil。
答案 0 :(得分:0)
你应该只翻译Parse已经在他们的名为“AnyPic”的教程中向他们展示了他们在ObjC中的上/和上/下投票“像按钮”系统,这里是转换为Swift的主要元素,你必须导入PAPCache.h / m PAPConstants.h / m和PAPUtility.h / m进入您的项目并构建一个桥接标题以链接到这些文件。从那里,您需要弄清楚的唯一部分是如何修改以下代码以满足您的需求,但这已经有效,您只需要重新排列变量,并将内容更改为Optionals或NON-optionals以使其工作为了你。我假设这个方法是最好的方法,因为Parse在他们的ObjC BIG教程中使用这个方法来展示应用程序“AnyPic”的所有内容,你必须在PFObject类型的UIVIewController中声明一个属性以及更多,但这是代码的内脏。没有人会给你完整的代码,因为这会占用很多代码,如果你在Swift中做到这一点会更容易,而不需要做我在过去30分钟内做的事情。将其与ObjC代码进行桥接将是费力的,但这就是它的完成方式。祝你好运!
您需要声明的内容,最低限度:
var likeUsers : NSArray?
var likeButton: UIButton?
var someObject: PFObject?
方法:
func didTapLikeButtonAction(button: UIButton) {
var liked = Bool()
liked = !button.selected
button.removeTarget(self, action: "didTapLikeButtonAction(button)", forControlEvents: UIControlEvents.TouchUpInside)
var originalLikeUsersArray = NSArray()
originalLikeUsersArray = self.likeUsers!
var newLikeUsersSet = NSMutableSet(capacity: self.likeUsers!.count)
for id in self.likeUsers! {
if id.objectId != PFUser.currentUser()?.objectId {
newLikeUsersSet.addObject(id)
}
}
if liked {
PAPCache.sharedCache().incrementLikerCountForPhoto(self.someObject)
newLikeUsersSet.addObject(PFUser.currentUser()!)
} else {
PAPCache.sharedCache().decrementLikerCountForPhoto(self.someObject)
}
PAPCache.sharedCache().setPhotoIsLikedByCurrentUser(self.someObject, liked: liked)
likeUsers = newLikeUsersSet.allObjects
if liked {
PAPUtility.likePhotoInBackground(self.someObject, block: {(success: Bool, error: NSError?) -> Void in
if !success {
button.addTarget(self, action: "didTapLikeButtonAction(button)", forControlEvents:UIControlEvents.TouchUpInside)
self.likeUsers = originalLikeUsersArray
self.setLikeButtonState(true)
}
})
} else {
PAPUtility.unlikePhotoInBackground(self.someObject, block: {(success: Bool, error: NSError?) -> Void in
if !success {
button.addTarget(self, action: "didTapLikeButtonAction(button)", forControlEvents:UIControlEvents.TouchUpInside)
self.likeUsers = originalLikeUsersArray
self.setLikeButtonState(false)
}
})
}
}
从ObjC翻译的LikeButtonFunction
func setLikeButtonState(selected: Bool) {
if selected {
likeButton?.titleEdgeInsets = UIEdgeInsetsMake( -1.0, 0.0, 0.0, 0.0)
} else {
likeButton?.titleEdgeInsets = UIEdgeInsetsMake( 0.0, 0.0, 0.0, 0.0)
}
likeButton?.selected = selected
}
您需要从此处下载“Anypic”项目:
https://parse.com/tutorials/anypic
你将需要导入Swift项目,最低限度,以下内容:
#import "PAPCache.h"
#import "PAPConstants.h"
#import "PAPUtility.h"
然后,您需要重新编码PAPCache,PAPUtility和PAPConstants以满足您的需求。祝你好运,由于Swift,这将是很多编码,但是如果你使用ObjC可能接近没有编码,因为Parse一遍又一遍地说他们不会在Swight测试之前大力推进Swift。他们最后一次再说这个是两个月前的六月。
原始代码,来自Objective-C,有些东西我没有为你做,因为这是你的应用程序,你必须自己做这些事情,如果你认为有必要,再次,ObjC代码完成,但是你选择使用Swift,所以重新编码已基本提供的内容,“开箱即用”就是你要处理的内容:
- (void)didTapLikePhotoButtonAction:(UIButton *)button {
BOOL liked = !button.selected;
[button removeTarget:self action:@selector(didTapLikePhotoButtonAction:) forControlEvents:UIControlEventTouchUpInside];
[self setLikeButtonState:liked];
NSArray *originalLikeUsersArray = [NSArray arrayWithArray:self.likeUsers];
NSMutableSet *newLikeUsersSet = [NSMutableSet setWithCapacity:[self.likeUsers count]];
for (PFUser *likeUser in self.likeUsers) {
if (![[likeUser objectId] isEqualToString:[[PFUser currentUser] objectId]]) {
[newLikeUsersSet addObject:likeUser];
}
}
if (liked) {
[[PAPCache sharedCache] incrementLikerCountForPhoto:self.photo];
[newLikeUsersSet addObject:[PFUser currentUser]];
} else {
[[PAPCache sharedCache] decrementLikerCountForPhoto:self.photo];
}
[[PAPCache sharedCache] setPhotoIsLikedByCurrentUser:self.photo liked:liked];
[self setLikeUsers:[newLikeUsersSet allObjects]];
if (liked) {
[PAPUtility likePhotoInBackground:self.photo block:^(BOOL succeeded, NSError *error) {
if (!succeeded) {
[button addTarget:self action:@selector(didTapLikePhotoButtonAction:) forControlEvents:UIControlEventTouchUpInside];
[self setLikeUsers:originalLikeUsersArray];
[self setLikeButtonState:NO];
}
}];
} else {
[PAPUtility unlikePhotoInBackground:self.photo block:^(BOOL succeeded, NSError *error) {
if (!succeeded) {
[button addTarget:self action:@selector(didTapLikePhotoButtonAction:) forControlEvents:UIControlEventTouchUpInside];
[self setLikeUsers:originalLikeUsersArray];
[self setLikeButtonState:YES];
}
}];
}
[[NSNotificationCenter defaultCenter] postNotificationName:PAPPhotoDetailsViewControllerUserLikedUnlikedPhotoNotification object:self.photo userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:liked] forKey:PAPPhotoDetailsViewControllerUserLikedUnlikedPhotoNotificationUserInfoLikedKey]];
}
- (void)didTapLikerButtonAction:(UIButton *)button {
PFUser *user = [self.likeUsers objectAtIndex:button.tag];
if (delegate && [delegate respondsToSelector:@selector(photoDetailsHeaderView:didTapUserButton:user:)]) {
[delegate photoDetailsHeaderView:self didTapUserButton:button user:user];
}
}
- (void)didTapUserNameButtonAction:(UIButton *)button {
if (delegate && [delegate respondsToSelector:@selector(photoDetailsHeaderView:didTapUserButton:user:)]) {
[delegate photoDetailsHeaderView:self didTapUserButton:button user:self.photographer];
}
}
上面的ObjC代码来自Parse.com AnyPic github repo的文件“PAPPhotoDetailsHeaderView.m”,您可以在我们上面列出的网站上的网站上看到他们的OBJECTIVE-C教程。
顺便说一下,这对我来说很有用,它确实为我编译,但我不使用Swift,所以这对我来说没用,但如果你设置正确,你就不需要了搞乱PAPCache,PAPConstants和PAPUtility。但这假设你精通Parse的所有事情。祝你好运。
我刚刚添加了从ObjC翻译的likeButtonOn / Off函数