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

标签 ios asynchronous authentication facebook-ios-sdk

我现在正在我的 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/

相关文章:

jquery - 仅在iphone/ipad 上的网站图库onclick 有错误

ios - 实时更新 UserDefaults 更改

python - 如何异步运行 Django 管理命令?

c# - 什么是异步编程?

ios - 是否可以仅从网页(而非网络应用程序)调用 native ios Facebook 登录对话框?

android - 是否可以在使用不同签名签名的不同 Android 应用程序之间共享 Android keystore ?

linux - 我可以通过 sudo -u 伪装的身份列表

ios - 如何控制 UITextField 的复制和粘贴弹出位置?

ios - 当手机进入横向状态时,以编程方式更改自定义表格单元格中标签的约束。 ios 快速

javascript - 如何在启动时使用异步存储数据渲染 React Native 组件?