发送Facebook异步请求的信号已完成

时间:2014-08-17 10:44:38

标签: ios facebook facebook-graph-api block

我有一些代码可以在facebook上查询信息

if (FBSession.activeSession.isOpen) {
            [[FBRequest requestForMe] startWithCompletionHandler:
             ^(FBRequestConnection *connection,
               NSDictionary<FBGraphUser> *user,
               NSError *error,) {
                 if (!error) {
                    //populate the **mUser** with data
                 } else {
                     NSLog(@"Facebook error encountered: %@", error);
                 }
             }];
        } else {
            NSLog(@"Facebook session is closed");
        }

我的问题是,告诉来电者facebook完成功能的最佳方法是什么?我不能简单地从块内部返回(不兼容的块指针类型)。

调用代码如下所示:

    myfacey *fb = [[myfacey alloc] init];
    [fb getUserFromFacebook: mUser];
     //Need to access a populated mUser object here
     //calls to mUser result in nil values because facebook hasn't finished

如果facebook同步访问内容我没有问题,因为mUser中会包含有效数据。

由于我必须进行异步调用,所以最好的方法是通知函数调用类填充变量吗?

1 个答案:

答案 0 :(得分:0)

异步方法完成后继续执行程序的最佳方法是将此代码放入完成处理程序。

不要尝试“返回”,只需“继续”完成处理程序中的程序。

您应该关心将从异步方法调用完成处理程序的“执行上下文”(比如线程或调度队列):如果没有明确记录,则可以在任何线程上调用完成处理程序。因此,您可能希望显式调度到主线程 - 如有必要:

if (FBSession.activeSession.isOpen) {
        [[FBRequest requestForMe] startWithCompletionHandler:
         ^(FBRequestConnection *connection,
           NSDictionary<FBGraphUser> *user,
           NSError *error,) {
             if (!error) {
                // Continue here with your program.
                ...
                // If you need ensure your code executes on the main thread:
                dispatch_async(dispatch_get_main_queue(), ^{
                     // continue with your program on the main thread, for example:
                     // populate the **mUser** with data
                     [self.tableView reloadData];
                     ...
                })
             } else {
                 NSLog(@"Facebook error encountered: %@", error);
             }
         }];
    } else {
        NSLog(@"Facebook session is closed");
    }