gpt4 book ai didi

ios - 如何响应异步事件(登录)?

转载 作者:行者123 更新时间:2023-11-29 05:01:23 24 4
gpt4 key购买 nike

我现在正在我的 iPhone 应用程序中实现一些 Facebook 功能,需要应用程序登录。登录本身不再是问题,它可以正常工作。

但由于 Facebook SDK 需要处理事件,我不知道如何执行操作来响应成功登录。

例如:

我有一个方法

- (void)refreshEvents;

该方法需要调用登录方法以确保该操作确实可以执行。所以我调用 [self checkLogin] - 但现在怎么办?我如何等待一个与我的方法没有真正绑定(bind)的事件?由于 checkLogin 触发异步操作/事件,我不能只是告诉它等待执行登录。

在方法中

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

在处理生成的访问 token 时,我如何告诉它初始操作是什么,以便它可以继续?

我的想法是使用一个数组的实例变量来保存“登录后执行的操作”队列,但这似乎是一个非常令人讨厌的解决方法。

感谢您的帮助

阿恩

最佳答案

最简单的解决方案是传递一个完成 block ,该完成 block 可以在登录完成后执行。此外,您可以传递一个在出现错误时被调用的 block 。在我的应用程序中,我将其包装到“响应者”模式中,您可以在其中定义一个包含完成和错误 block 的类。它作为参数传递给异步方法。这里唯一的问题是您必须编写登录名才能在适当的时间“执行” block 。

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

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

在最简单的形式中,您只需添加一个完成 block 即可。首先,您需要为完成 block 创建一个 typedef。在本例中,我们将使用一个不返回值且具有 id 输入的 block :

typedef void (^successBlock)(id);

接下来,您可以创建一个 Controller ,该 Controller 为您与 Facebook 类的交互创建外观。在此外观中,您可以创建一个具有如下签名的登录方法(假设您有一个 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 实现中,您可以执行此 block :

#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);
}
}

我上面提到的“响应者”模式比这更复杂一些,但这应该足以让您继续下去。

关于ios - 如何响应异步事件(登录)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6830976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com