我正在使用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;
}];
}
我如何获得返回值?
我试过谷歌,但我无法抓住它。
我希望任何指针都朝着正确的方向发展。
修改 主要问题如下:我需要完成处理程序来调用另一个类中的方法......怎么做?
答案 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.
}];
注意:您应该在触发回调之前处理错误。
更好的是,你可能会尝试传递一个带有所有参数的回调(没有经过测试,也不确定语法。如果有人可以纠正我,我会很感激):
-(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
}];
答案 1 :(得分:1)
你已经拥有它:)
我会编写一个方法来处理字典,以便使completionHandler块更加清晰 - 但你可以在块中编写响应处理代码。正如另一位评论者所提到的,这是异步的,所以你并不是真的"返回"任何......当你被调用时,你正在处理完成块。
为了帮助您理解一点,在这种情况下,completionHandler块是您作为参数传递给方法的一大块代码,以便稍后调用。实质上,"每当这个电话回来时,执行以下操作:^ {"。 FBRequest方法的实现将调用您的completionHandler(无论可能是什么)。