Parse中的块

时间:2015-09-16 01:29:51

标签: ios objective-c

我已经开始在练习iOS应用程序中使用Parse(我使用Cocoapods下载),并且在理解某些概念时遇到了一些麻烦。

我到目前为止编写了这段代码:

- (IBAction)saveUserButtonClicked:(id)sender {
    PFObject *loginCredentials = [PFObject objectWithClassName:@"LoginCredentials"];
    loginCredentials[@"name"] = self.usernameTextField.text;
    loginCredentials[@"password"] = self.passwordTextField.text;


    [loginCredentials saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if(error.code == kPFErrorConnectionFailed){
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Please check you connection" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
            [alertView show];
        }else if(succeeded && !error){
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Save" message:@"Your object saved" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
            [alertView show];
        }else if(error){
            NSLog(@"%@", error);
        }

    }];
}

我的主要问题是使用saveInBackGroundWithBlock的目的是什么。我可以这样做:

[loginCredentials saveInBackground];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Save" message:@"Your object saved" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alertView show];

如果我们想要访问成功和错误变量,那么该块是否有用?

2 个答案:

答案 0 :(得分:1)

saveInBackgroundWithBlock中,保存操作在不在主线程(UI使用的线程)中的后台线程中执行,一旦它结束执行,它就会回调块来执行它。不使用主线程进行此保存操作会使用户界面在另一个线程中执行保存时响应。

您可以使用save方法在主线程中进行保存操作,然后根据成功显示警告,但是您将完全阻止用户界面,这不是最佳做法,除非它必须继续在应用程序上。

bool succeeded = [loginCredentials save];

答案 1 :(得分:1)

同步调用将在主线程(UI线程)上执行代码,这将阻止UI响应用户事件。这通常被认为是不好的做法,因为它给用户留下了你的应用已经冻结的印象,而实际上一个线程不能同时做两件事。因此,您通常使用异步调用(块)在后台线程上执行复杂代码,释放UI以继续执行某些操作,这样用户就不会感到困惑,或者只是等待操作完成。

查看PFObject规范,– saveInBackground– saveInBackgroundWithBlock:方法是异步选项。在这种情况下,回调块只是报告操作是否成功,并包含NSError对象,以便在失败时进行报告。

所有人都说,我认为你可以使用你的代码保存对象,但你不会有机会回应过程中出现的任何错误。这意味着,在创建和显示警报视图时,您假设您的对象已成功保存。

我的意见基于saveInBackground方法实现,它只是返回一个BFTask对象:

- (BFTask *)saveInBackground {
    return [self.taskQueue enqueue:^BFTask *(BFTask *toAwait) {
        return [self saveAsync:toAwait];
    }];
}

这里是关于Parse的两个方法的对象文档:

  

- saveInBackground

     

异步保存PFObject。

     
      
  • (BFTask PF_GENERIC(NSNumber *)*)saveInBackground
  •   
     

返回值

     

封装正在完成的工作的任务。

     

在PFObject.h中声明

     

- saveInBackgroundWithBlock:

     

异步保存PFObject并执行给定的回调块。

     
      
  • (void)saveInBackgroundWithBlock :( PF_NULLABLE PFBooleanResultBlock)block
  •   
     

参数   阻止

     

要执行的块。   它应该具有以下参数签名:^(BOOL成功,NSError *错误)。

     

在PFObject.h中声明

如果您对处理错误不感兴趣,并且您的对象保存起来非常简单,您是否考虑过使用其中一种同步保存方法,例如- (BOOL)save- (BOOL)save:(NSError **)error?您可以立即响应返回的BOOL值,类似于您在上面发布的Parse示例(在完成块内)。