具有返回值的iOS块

问题描述 投票:7回答:2

我正在使用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;                              
       }];

}

我如何获得返回值?

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

我会很感激任何指针在正确的方向。

编辑:主要问题如下:我需要完成处理程序来调用另一个类中的方法...如何做到这一点?

ios objective-c facebook objective-c-blocks
2个回答
13
投票

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

所以,为了保持这种异步,我假设您想在自己的函数中使用this的结果,所以在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
投票

你已经拥有它:)

我会写一个方法来处理字典,以保持completionHandler块更清洁 - 但你可以在块中编写响应处理代码。正如另一位评论者所提到的,这是异步的,所以你并没有真正“返回”任何东西......当你被调用时,你正在处理完成块。

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

© www.soinside.com 2019 - 2024. All rights reserved.