6

私は IOS Facebook SDK 3 を使用していますが、より効率的なアプローチで使用しようとしています。そのため、いくつかのリクエストを別のスレッドで管理したいと思います。

たとえば、このリクエスト (WORKS PERFECTLY) :

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

私はこの問題を少し抱えていました。

メインスレッドでコードをディスパッチしてください。

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 に答える