在pfcloud函数内返回bool

时间:2014-10-28 10:51:06

标签: ios objective-c parse-platform objective-c-blocks

我正在创建一种方法,用于检查用户是否有已注册到该应用的朋友。但是,当我尝试从此块中返回时,我收到编译错误:Incompatible block pointer types sending 'BOOL (^)(__strong id, NSError *__strong)' to parameter of type 'PFIdResultBlock' (aka 'void (^)(__strong id, NSError *__strong)')

这是我运行以下代码的时候:

 -(BOOL)hasFriend:(NSArray*)phoneNums{
    [PFCloud callFunctionInBackground:@"checkUsers"
                                   withParameters:@{@"array": phoneNums}
                                            block:^(id success, NSError *error) {
                                              if(success){
                                                return YES;
                                              }
                                              else{
                                                return NO;
                                                  }];
    }

我也试过这个:

-(BOOL)hasFriend:(NSArray*)phoneNums{
  __block bool hasFriend = nil;

  [PFCloud callFunctionInBackground:@"checkUsers"
                   withParameters:@{@"array": phoneNums}
                            block:^(id success, NSError *error) {
                              if(success){
                                hasFriend = YES;
                                NSLog(@"found a florin user!");
                              }
                              else{
                                hasFriend = NO;
                                }
                              }
                            }];

  NSParameterAssert(hasFriend);
  return hasFriend;
}

但是,这永远不会通过NSParameterAssert

2 个答案:

答案 0 :(得分:2)

直到函数返回后才会执行该块,因此您无法从函数中返回值...您需要在函数中使用回调块(另一个):

-(void) hasFriend:(NSArray*)phoneNums withCallback:(void(^)(BOOL hasFriend))callback {

    [PFCloud callFunctionInBackground:@"checkUsers"
                       withParameters:@{@"array": phoneNums}
                                block:^(id success, NSError *error) {

                                    if (success)
                                        callback(YES);
                                    else
                                        callback(NO);

                                }];

}

要使用它,你需要提供这样的回调:

[myObj hasFriend:nums withCallback:^(BOOL hasFriend) {

    if (hasFriend)
        NSLog(@"Found friend!");
    else
        NSLog(@"Friend not found...");

}];

答案 1 :(得分:1)

PFIdResultBlock没有返回类型(**void** (^)(__strong id, NSError *__strong)。 " callFunctionInBackground"是异步操作。这意味着在return hasFriend行,你实际上无法收到你需要的结果。

只需将完成块作为方法参数按此

- (void)checkHasFriendWithNums:(NSArray *)phoneNums
{
  [PFCloud callFunctionInBackground:@"checkUsers"
                   withParameters:@{@"array": phoneNums}
                            block:^(id success, NSError *error) {
                              if(success){
                                hasFriend = YES;
                                NSLog(@"found a florin user!");
                              }
                              else{
                                hasFriend = NO;
                                }
                              if(completion) // perform the block
                                completion(hasFriend);
                              }
                            }];
}

- (void)someMethodWithPhoneNums:(NSArray *)phoneNums
{
  [self checkHasFriendWithPhoneNums:phoneNums completionBlock:^(BOOL hasFriend){
       if (hasFriend)
       {
          // do something
       }
  }];
}

如果你不喜欢积木 - 请改用方法。

- (void)checkHasFriendWithNums:(NSArray *)phoneNums completionBlock:(void(^)(BOOL hasFriends))completion
{
  [PFCloud callFunctionInBackground:@"checkUsers"
                   withParameters:@{@"array": phoneNums}
                            block:^(id success, NSError *error) {
                              if(success)
                                [self hasFriends];
                              else
                                [self hasNoFriends];
                              }
                            }];
}

- (void)hasFriends
{
  // do something
}

- (void)hasNoFriends
{
  // do something
}