【问题标题】:Async FB request with block in separated thread issue异步 FB 请求与分离线程问题中的块
【发布时间】:2012-08-28 01:39:36
【问题描述】:

我正在使用 IOS Facebook SDK 3,并尝试以更有效的方法使用它。 所以我想在不同的线程中管理一些请求。

例如这个请求(完美运行):

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_async(queue, ^{

    [self generateShareContentFor:ShareServiceTypeFacebook 
                         callback:^(NSMutableDictionary* obj)
     {
         FBRequest * rq = [FBRequest requestWithGraphPath:@"me/feed" 
                                               parameters:obj 
                                               HTTPMethod:@"POST"];
         [rq startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 

              dispatch_async(dispatch_get_main_queue(), ^{
                 // TREATING RESULT
                 [[UFBManager defaultManager] errorHandlerFromError:error 
                                                         fromRqType:UFBManagerRqTypePost];
              });

          }];
     }];  

});
  • 我正在使用这个在我的提要上发布一些东西,我调用一个方法来自动加载这个请求的内容,然后这个块将在方法中调用来启动请求。 这个很好用。

  • 问题是如果我不把这个请求放在一个块中,那是行不通的。

此请求无效

     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
     dispatch_async(queue, ^{

          FBRequest * rq = [FBRequest requestForMe];
          [rq startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {

                  dispatch_async(dispatch_get_main_queue(), ^{

                    // TREATING RESULT
                    [[UFBManager defaultManager] errorHandlerFromError:error 
                                                          fromRqType:UFBManagerRqTypeGet];

                  });

          }];
     });

我想弄清楚,但我不明白问题出在哪里。 提前感谢您的帮助。

【问题讨论】:

  • 您将不得不提供更多信息。 “不起作用”是什么意思?
  • 感谢您的回答克里斯托弗,并很抱歉缺乏信息。当我尝试调试第二个请求时,我可以记录到 *rq 声明,但是在启动 startCompletionHandler 方法时声明的完成处理程序块没有任何返回

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


【解决方案1】:

我有这个问题。

确保在主线程上调度代码。

dispatch_async(dispatch_get_main_queue, ^{

           FBRequest * rq = [FBRequest requestForMe];
           [rq startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                   //The docs say this will be the main queue here anyway
                   //Feel free to go on a background thread at this point
                   }];

        });

【讨论】:

    【解决方案2】:

    我不确定为什么它在一种情况下有效,而在另一种情况下无效,但我认为这与startWithCompletionHandler: 返回后后台队列未运行的运行循环有关。

    但我想知道你为什么要把它放在后台队列中,因为它是一个异步调用。为什么不直接从主线程执行此操作:

    FBRequest * rq = [FBRequest requestForMe];
    [rq startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
          dispatch_async(dispatch_get_main_queue(), ^{
            [[UFBManager defaultManager] errorHandlerFromError:error 
                                                  fromRqType:UFBManagerRqTypeGet];
          });
    }];
    

    【讨论】:

    • 我的问题是主线程已经被其他东西占用了,我的目标是在不同的线程中加载你的Facebook好友列表,以免加重主线程的负担
    • 我明白了,看起来FBURLConnection 只是在调用它的线程上运行了一个 NSURLConnection。我原以为它会在后台线程上运行网络连接。否则,为什么要公开异步 API?
    • 是的,这是真的,我没有考虑它,而且看起来很合乎逻辑,所以我应该做的是在第二个线程中处理我的 5000 个朋友列表。因为这个回调:startWithCompletionHandler: 在主队列中执行,所以列表处理将从这个主队列调度?我有正确的方法吗?
    • 我在 Facebook 开发人员上提交了一份错误报告,原因非常相似:developers.facebook.com/bugs/551787081506376
    • 对此有何解决方案?我有同样的问题。 FB 似乎已经关闭了这个 bug 没有修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2021-02-18
    • 2014-09-12
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多