6

我正在与IOS Facebook SDK 3,我试图用更有效的方法。 所以我想在不同的线程中管理一些请求。异步FB请求与块分离线程问题

例如该请求(PERFECTLY WORKS):

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

        }); 

      }]; 
    }); 

我想弄清楚,但我不明白是什么问题。 预先感谢您的帮助。

+0

您将不得不提供更多信息。你的意思是“不起作用”? –

+0

谢谢你的回答克里斯托弗,并对缺乏信息感到抱歉。当我尝试调试这个第二个请求时,我可以记录直到* rq声明,但是我没有任何返回在启动startCompletionHandler方法时声明的完成处理程序块 –

回答

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]; 
     }); 
}]; 
+0

问题在我的情况是主线程已经被其他东西占用了,我的目标是加载你的Facebook朋友的列表在不同的线程中,以免重负担主要的 –

+0

我看到,它看起来像'FBURLConnection'只是在它的线程上运行NSURLConnection从...调用。我原以为它会在后台线程上运行网络连接。否则,为什么要公开一个异步API? –

+0

是的,这是真的,我没有考虑它,这似乎是合乎逻辑的,所以我应该做的是在第二个线程中对待,例如我的5000个朋友的列表。因为这个回调函数:'startWithCompletionHandler:'在主队列中执行,所以列表处理将从这个主队列中调度?我有正确的方法吗? –

6

我有这个问题了一下。

确保您在主线程上发送代码。

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

     });