2014-10-28 81 views
1

我正在創建一個方法來檢查用戶是否有任何已經註冊到應用程序的朋友。然而,當我試圖從該塊內返回,我得到一個編譯錯誤說:Incompatible block pointer types sending 'BOOL (^)(__strong id, NSError *__strong)' to parameter of type 'PFIdResultBlock' (aka 'void (^)(__strong id, NSError *__strong)')在pfcloud函數中返回bool

這是當我運行下面的代碼:

-(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

第一種方法崩潰,因爲您正在創建一個返回類型爲void的塊,但試圖返回一個BOOL。我並不十分熟悉NSParameterAssert函數,但文檔中說'斷言評估條件,如果條件計算結果爲false,則調用當前線程的斷言處理程序......'也許'hasFriend'是'NO', NSParameterAssert函數將其視爲false並嘗試調用斷言處理程序。您使用此功能的任何特定原因? – AMI289 2014-10-28 11:40:10

回答

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

的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 
} 
+0

迂腐的筆記:你實際上並沒有在這裏傳遞完成塊,而是讓它被捕獲。 – ravron 2014-10-28 11:50:56

+0

有沒有辦法做到這一點沒有完成塊?所以我可以調用'if([self hasFriends:numbers]){}'? – bdv 2014-10-28 22:06:31

+0

@bdv你可以調用你的類的某些方法,而不是完成塊。 – Astoria 2014-10-29 07:18:11