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

     });