我正在创建一种方法,用于检查用户是否有已注册到该应用的朋友。但是,当我尝试从此块中返回时,我收到编译错误: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
。
答案 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
}