【问题标题】:How do I get notified when a PFObject is saved to my Parse backend?当 PFObject 保存到我的 Parse 后端时,我如何得到通知?
【发布时间】:2015-08-27 02:52:46
【问题描述】:

我已按照快速入门指南进行解析: https://parse.com/apps/quickstart#parse_data/mobile/ios/native/existing

我正在使用这段代码来保存一个 PFObject:

PFObject *testObject = [PFObject objectWithClassName:@"TestObject"];
testObject[@"Bookmarks"] = @"Restore Successful";
[testObject saveInBackground];

下面是我的 PFObject 保存到我的 Parse 后端时的样子:

我希望在发生这种情况时收到一些通知。就像电子邮件、文本或推送通知一样。任何可行的方法。

【问题讨论】:

  • 你有回调处理程序告诉你什么时候保存,这还不够吗?还是出于某种原因您需要应用程序外部的东西?在这个回调块方法中,你可以执行一些你想做的事情
  • 另外,查看云代码 - 保存后
  • 如果你想让我告诉你我的意思,我有完整的代码实现给你
  • @Larcerax 如果可以的话,那就太好了。
  • 是的,所以,我先警告你,这可能比你想象的要简单,但你会明白的,它都是客户端

标签: ios parse-platform


【解决方案1】:

Parse 推荐的做法是使用 Cloud Code。一次,你configure it,在main.js 文件中添加以下函数:

Parse.Cloud.afterSave("Posts", function(request) {

    // Gets called when a new object is added to the 'Posts' class.
    // From here you can proceed to send push notifications     

});

afterSave 方法是在将新对象添加到指定类后触发的。如果您想管理,是否应该保存对象,请查看beforeSave

【讨论】:

  • 如果我已经保存了 PFObject,是否需要查看 beforeSave?
  • 不,在这种情况下使用 afterSave 应该没问题。
【解决方案2】:

我刚刚整理的快速示例:示例:

-(void)saveLesson {
    lesson = [PFObject objectWithClassName:@"lessons"];
    PFObject *photo = [PFObject objectWithClassName:@"photoslessons"];
    [photo setObject:[PFUser currentUser] forKey:@"userId"];
    [photo setObject:self.photoFile forKey:@"lessonimage"];
    [photo setObject:self.smallPhotoFile forKey:@"smalllessonimage"];
    [photo setObject:self.thumbnailFile forKey:@"thumblessonimage"];
    [photo setObject:self.originalFile forKey:@"originallessonimage"];
    PFACL *publicACL = [PFACL ACL];
    [publicACL setPublicWriteAccess:YES];
    [publicACL setPublicReadAccess:YES];
    photo.ACL = publicACL;
    self.photoPostBackgroundTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.photoPostBackgroundTaskId];
    }];
    [photo saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (succeeded) {
            NSLog(@"Photo uploaded");
            NSNumber *userCount = [[NSNumber alloc] initWithInt:0];
            lesson[@"textBody"] = [[[self contentView] descriptionText] text];
            lesson[@"title"] =  [[[self contentView] title] text];
            lesson[@"likes"] =  userCount;
            lesson[@"times_viewed"] =  userCount;
            lesson[@"featured"] =  @"false";
            lesson[@"userId"] = [PFObject objectWithoutDataWithClassName:@"_User" objectId:[PFUser currentUser].objectId];
            lesson[@"lessonimage"]= photo;
            [lesson saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                if (succeeded) {
                    PFQuery *query = [PFQuery queryWithClassName:@"activesessions"];
                    [query whereKey:@"teacherid" equalTo:[PFUser currentUser]];
                    [query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
                        if (object!=nil) {
                            [object setObject:lesson forKey:@"lessonid"];
                            [object saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                                if (succeeded) {
                                    [(NSHLiveStudentProfileViewController*)self.navigationController.viewControllers[0] thisIsAHack];
                                    [[self navigationController] popToRootViewControllerAnimated:true];
                                }
                            }];
                        }}];
                } else if (error) {
                    NSString *  alertTitle = @"Error Saving Lesson";
                    UIAlertController * alert =  [UIAlertController alertControllerWithTitle:alertTitle message:@"Please make sure to include both a title and description." preferredStyle:UIAlertControllerStyleAlert];
                    UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { }];
                    [alert addAction:ok];
                    [self presentViewController:alert animated:YES completion:^{}];
                }
            }];
        } else {
            NSLog(@"Photo failed to save: %@", error);
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Couldn't post your photo" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Dismiss", nil];
            [alert show];
        }
        [[UIApplication sharedApplication] endBackgroundTask:self.photoPostBackgroundTaskId];
    }];
}

所以,这是很多代码,但这是我们将要帮助您解决的问题,让我们添加一个向自己发送电子邮件的方法:

首先,下载加载 pod mailgun:

然后这样做:

 Mailgun *mailgun = [Mailgun clientWithDomain:kMailGunAPIClientDomain apiKey:kMailGunAPIKey];

另外,注册一个邮枪账户,然后给自己发一封电子邮件

然后在上面的代码中,只要和对象在块中保存为“成功”,如下所示:

首先,显然改变这个:

 @"Peter Pan <peterpan.notarealemailaddress@gmail.com>" 

到您的邮件地址,然后填写需要您的 API 密钥的部分,以便您从 MailGun 获得,mailgun 很便宜,并且在您设置 mail gun 帐户后立即为您工作(我不为mailgun,我只是一个快乐的用户)

[lesson saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
       if (succeeded) {

         [mailgun sendMessageTo:@"Peter Pan <peterpan.notarealemailaddress@gmail.com>"
                            from:@"Excited User <apeterpan.notarealemailaddress@gmail.com>>"
                         subject:@"Mailgun is awesome!"
                            body:@"and life is great!"];

轰隆隆!,

这是 MailGun 吊舱:https://github.com/rackerlabs/objc-mailgun

注册一个免费帐户:http://www.mailgun.com/

测试一下,这件事的妙处是它是自动触发的,你可以在我放在这里的电子邮件呼叫中放任何你想要的东西,你还需要获得 AFNetworking:

在这里获取:https://github.com/AFNetworking/AFNetworking

此方法不需要任何类型的 javascript 云编码,您甚至可以将电子邮件正文替换为您想要发送给自己的信息。如果您想将刚刚触发您方法的人的 USER ID 发送给自己,那么您就有了,电子邮件将被发送。

所以你有这个:

PFObject *testObject = [PFObject objectWithClassName:@"TestObject"];
testObject[@"Bookmarks"] = @"Restore Successful";
[testObject saveInBackground];

改成这样:

PFObject *testObject = [PFObject objectWithClassName:@"TestObject"];
testObject[@"Bookmarks"] = @"Restore Successful";
[testObject saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    if (succeeded) {
        NSLog(@"successfully SAVED!");
    }
}];

这是您的自定义保存功能:

-(void)customSaveFunction {
    PFObject *testObject = [PFObject objectWithClassName:@"TestObject"];
    testObject[@"Bookmarks"] = @"Restore Successful";
    [testObject saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (succeeded) {
             NSLog(@"successfully SAVED!");
             Mailgun *mailgun = [Mailgun clientWithDomain:kMailGunAPIClientDomain apiKey:kMailGunAPIKey];
            [mailgun sendMessageTo:@"Peter Pan <peterpan.notarealemailaddress@gmail.com>"
                                from:@"Excited User <apeterpan.notarealemailaddress@gmail.com>>"
                             subject:@"Mailgun is awesome!"
                                body:@"and life is great!"];
        }
    }];
 }

我展示了保存课程示例,您可以在电子邮件中发送多封电子邮件,其中包含多个信息以用于不同的保存触发器,但是这段代码现在对我来说没用,这仅用于主要测试目的,所以自定义保存我在这几句话上方发布的功能是您自己如何做,或者只是将相同的代码放入您的视图控制器或保存对象的任何地方。

【讨论】:

  • 这看起来很棒但是我如何保存我需要保存的东西,而不是照片示例?我只需要保存 PFObject *testObject = [PFObject objectWithClassName:@"TestObject"]; testObject[@"Bookmarks"] = @"恢复成功"; [testObject saveInBackground];在行书签字符串的对象 IAP 中
  • 是的,Creagen,用另一种方法在后台保存东西,我会告诉你
  • 再次检查答案,我向您展示的方式是带有成功处理程序的块方法,因此您将知道是否/何时保存,在“如果(成功) { .. } "这是您使用邮枪自助电子邮件服务的地方
  • 当你使用这种方法在mailgun服务中插入时,如果你想将对象信息发送给自己,那么只需配置电子邮件发送字符串给自己,就这么简单。
  • 但是 -(void)saveLesson 呢?我如何处理里面的代码?我假设我不只是复制和粘贴它。 :p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多