具有返回值的iOS块

时间:2014-04-05 16:20:05

标签: ios objective-c facebook objective-c-blocks

我正在使用Facebook SDK中的一个块。它返回一个字典。我希望该字典作为方法的返回值。我试图围绕整个街区概念,但需要在正确的方向上轻推。

块: (块的参数是字符串userFBid)

-(NSDictionary*) getMutualFBFriendsWithFBid:(NSString*)fbID {

[FBRequestConnection startWithGraphPath:[NSString stringWithFormat:@"/%@/mutualfriends/%@", [[PFUser currentUser] objectForKey:kFbID],userFBid]
                    parameters:nil
                             HTTPMethod:@"GET"
                      completionHandler:^(
                                          FBRequestConnection *connection,
                                          id result,
                                          NSError *error
                                          ) {
                          result = (NSDictionary*)result;

//return result;                              
       }];

}

我如何获得返回值?

我试过谷歌,但我无法抓住它。

我希望任何指针都朝着正确的方向发展。

修改 主要问题如下:我需要完成处理程序来调用另一个类中的方法......怎么做?

2 个答案:

答案 0 :(得分:13)

由于方法startWithGraphPath是异步的,您不能将其编码为同步:它表示没有返回值,因为只要调用此方法,您的应用就会继续执行到下一行,并且不会等待返回的值。

所以,为了保持这种异步,我假设你想在你自己的函数中使用它的结果,所以在completionHandler块中调用它:

[FBRequestConnection startWithGraphPath:[NSString stringWithFormat:@"/%@/mutualfriends/%@", [[PFUser currentUser] objectForKey:kFbID],userFBid]
                             parameters:nil
                             HTTPMethod:@"GET"
                      completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                          [self myRockinFunction:result];
       }];

//Considering this function 
-(void)myRockinFunction:(NSDictionary*) fb_result{
    //Do stuff with fb_result
}

修改

好的,我明白了。修改您的方法以接受回调作为参数:

-(NSDictionary*) getMutualFBFriendsWithFBid:(NSString*)fbID andCallback:(void (^)(NSDictionary *))callback {

    [FBRequestConnection startWithGraphPath:[NSString stringWithFormat:@"/%@/mutualfriends/%@", [[PFUser currentUser] objectForKey:kFbID],userFBid]
                    parameters:nil
                             HTTPMethod:@"GET"
                      completionHandler:^(FBRequestConnection *connection,id result,NSError *error) {
         //You should treat errors first
         //Then cast the result to an NSDictionary
         callback((NSDictionary*) result); //And trigger the callback with the result
    }];
}

然后,在您的其他课程中,使用另一个块来处理您的结果:

[YourHelperClass getMutualFBFriendsWithFBid:fbID andCallback:^(NSDictionary* result){
    //Use result how you wish
    //Beware, this is async too.
}];

注意:您应该在触发回调之前处理错误。

编辑2(其他用户的帮助表示赞赏)

更好的是,你可能会尝试传递一个带有所有参数的回调(没有经过测试,也不确定语法。如果有人可以纠正我,我会很感激):

-(NSDictionary*) getMutualFBFriendsWithFBid:(NSString*)fbID andCallback:(void (^)(FBRequestConnection *,NSDictionary *,NSError *))callback {

    [FBRequestConnection startWithGraphPath:[NSString stringWithFormat:@"/%@/mutualfriends/%@", [[PFUser currentUser] objectForKey:kFbID],userFBid]
                    parameters:nil
                             HTTPMethod:@"GET"
                      completionHandler:callback()]; //Not sure here!
}

[YourHelperClass getMutualFBFriendsWithFBid:fbID andCallback:^(FBRequestConnection *connection,NSDictionary * result,NSError *error){
     //You could deal with errors here now
}];

Here's a reference on Apple's docs以便更深入了解。

答案 1 :(得分:1)

你已经拥有它:)

我会编写一个方法来处理字典,以便使completionHandler块更加清晰 - 但你可以在块中编写响应处理代码。正如另一位评论者所提到的,这是异步的,所以你并不是真的"返回"任何......当你被调用时,你正在处理完成块。

为了帮助您理解一点,在这种情况下,completionHandler块是您作为参数传递给方法的一大块代码,以便稍后调用。实质上,"每当这个电话回来时,执行以下操作:^ {"。 FBRequest方法的实现将调用您的completionHandler(无论可能是什么)。