6

我正在使用 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];

                  });

          }];
     });

我试图弄清楚,但我不明白是什么问题。在此先感谢您的帮助。

4

2 回答 2

6

I had this problem for a bit.

Make sure you dispatch the code on the main thread.

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
                   }];

        });
于 2014-08-13T11:00:55.613 回答
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];
      });
}];
于 2012-08-30T04:17:05.257 回答