如何对asynchronous事件(login)作出反应?

我正在iPhone应用程序中实现一些Facebookfunction,需要一个应用程序login。 login本身不再是一个问题,它的工作。

但是,由于Facebook SDK与事件一起工作的事实,我不知道如何执行我的行动作为成功login的反应。

例如:

我有一个方法

- (void)refreshEvents; 

此方法需要调用login方法以确保该操作可以实际执行。 所以我打电话给[self checkLogin] – 但现在呢? 我怎样才能等待一个事件不受我的方法的束缚? 当checkLogin触发asynchronous操作/事件时,我不能只是告诉它等待login执行。

在该方法中

 - (void)request:(FBRequest *)request didLoad:(id)result; 

同时处理由此产生的访问令牌,我怎么能告诉它最初的行为是什么,所以它可以继续?

我的想法是使用一个实例variables为一个数组持有一个“login后执行的动作”队列,但这似乎是一个非常讨厌的解决方法。

谢谢你的帮助

阿恩

最简单的解决scheme是传递一个完成块,一旦login完成就可以执行完成块。 另外,如果发生错误,则可以传递一个被调用的块。 在我的应用程序中,我已经把它包装成一个“响应者”模式,在这个模式中你定义了一个包含完成和错误块的类。 这是作为asynchronous方法的parameter passing的。 唯一需要注意的是你必须在适当的时候写入login来“执行”块。

我已经在使用asynchronousAPI(包括Facebook SDK)的应用程序上多次实现了这个模式。

更新(添加了一些代码示例):

最简单的forms,你可以添加一个完成块。 首先,你会想为你的完成块创build一个typedef。 在这种情况下,我们将使用一个不返回值并且有一个idinput的块:

 typedef void (^successBlock)(id); 

接下来,您可以创build一个控制器,为您与Facebook类的交互创build一个外观。 在这个外观中,你可以创build一个类似这样的签名的login方法(假设你有一个types为successBlock的iVar):

 - (void)loginWithCompletionHandler:(successBlock)handler { // If you aren't using ARC - you'll need to use Block_copy(handler) completionHandler = handler; [facebook authorize:facebookSettings.defaultPermissions delegate:self]; } 

最后,在你的FBSessionDelegate实现中,你可以执行这个块:

 #pragma mark - FBSessionDelegate Implementation - (void)fbDidLogin { // Store Facebook token, etc..... if( completionHandler ) { // You could pass any data you want in this data property completionHandler(data); } } 

}

上面提到的“响应者”模式比这个更复杂一点,但是这应该足以让你走了。