【问题标题】:iOS block with return value带有返回值的 iOS 块
【发布时间】:2014-04-05 16:20:04
【问题描述】:

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

}

如何获取返回值?

我试图用谷歌搜索它,但我无法解决它。

我将不胜感激任何指向正确方向的指针。

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

【问题讨论】:

  • 请求是异步的,因此您应该在该块中处理“结果”字典或创建一个附加方法并将结果字典作为参数调用它。
  • 我在不同的类中使用相同的“结果”,所以我宁愿能够调用它并在这些不同的类中使用结果。试着弄清楚如何。
  • @B-Man 您可以将result 存储在您自己的公共实例变量中,并在您的其他类中访问它。这就是你的目标吗?
  • @Bigood 是的,是的。请参阅上面的编辑。我必须把这个方法放在一个单例类中,然后在另一个类中使用结果。所以你很感兴趣,只是想弄清楚如何真正做到这一点。我无法想象,我只是为 Singleton 类分配了一个公共属性,并在需要时获取它,然后将调用该块?
  • @B-Man 我不明白:你为什么要在别处调用completionHandler的块?

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


【解决方案1】:

由于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 加深理解。

【讨论】:

  • 我明白了...但是由于异步请求是在Singleton类中进行的,因此我需要在另一个类中调用完成方法。有没有一种简单的方法可以做到这一点,具体取决于哪个类调用请求?
  • @B-Man 你能试试我的第二个提议吗?我不确定,但它可能对你更好
  • 第一个编辑实际上运行良好......第二个是说它在“完成处理程序”之后的回调中缺少 3 个参数。我想玩它
  • @B-Man 试试callback(FBRequestConnection *connection,id result,NSError *error)
  • 我试过没用。 (刚出家以后再试试)。
【解决方案2】:

你已经拥有它了:)

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

为了帮助您理解一点,在这种情况下,completionHandler 块是您作为参数传递给方法的一段代码,以便稍后调用。本质上,“只要这个电话回来,就这样做:^{”。 FBRequest 方法的实现将调用您的 completionHandler(无论它是什么)。

【讨论】:

  • 我理解那部分,我可以看到我是如何以错误的方式处理这个问题的。我试图想办法从不同的其他类调用这个请求,以及在请求完成时如何处理结果。
猜你喜欢
  • 1970-01-01
  • 2013-02-28
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 2014-04-30
相关资源
最近更新 更多