6

Tôi đang làm việc với SDK của iOS Facebook 3 và tôi đang cố gắng sử dụng nó với cách tiếp cận hiệu quả hơn. Vì vậy, tôi muốn quản lý một số yêu cầu trong các chuỗi riêng biệt.Yêu cầu FB không đồng bộ với khối trong vấn đề chuỗi riêng lẻ

Ví dụ yêu cầu này (hoạt động hoàn hảo):

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

      }]; 
    }]; 

}); 
  • Tôi đang sử dụng cái này để viết một cái gì đó về thức ăn chăn nuôi tôi, tôi gọi một phương thức để nạp nội dung của yêu cầu này tự động và sau đó khối này sẽ được gọi trong phương thức để khởi chạy yêu cầu. Cái này hoạt động tốt.

  • Vấn đề là nếu tôi không đặt yêu cầu này bên trong một khối, điều đó không hiệu quả.

Yêu cầu này không hoạt động

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

        }); 

      }]; 
    }); 

Tôi đang cố gắng tìm ra, nhưng tôi không hiểu vấn đề là gì. Cảm ơn trước vì sự giúp đỡ của bạn.

+0

Bạn sẽ phải cung cấp thêm một số thông tin. Bạn có ý nghĩa gì bởi "không hoạt động"? –

+0

Cảm ơn câu trả lời của bạn Christopher, và xin lỗi vì thiếu thông tin. Khi tôi cố gắng gỡ lỗi yêu cầu thứ hai này, tôi có thể đăng nhập cho đến khi khai báo * rq, nhưng tôi không có bất kỳ trở lại nào của khối xử lý hoàn thành được khai báo khi khởi động phương thức startCompletionHandler –

Trả lời

2

Tôi không tích cực tại sao nó hoạt động trong một trường hợp chứ không phải trường hợp khác, nhưng tôi nghĩ rằng nó phải làm với vòng lặp chạy cho hàng đợi nền của bạn không chạy sau khi trả về startWithCompletionHandler:.

Nhưng tôi tự hỏi tại sao bạn đang đặt nó trên một hàng đợi nền dù sao, vì đó là một cuộc gọi không đồng bộ. Tại sao không chỉ thực hiện việc này từ chủ đề chính:

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

Vấn đề trong trường hợp của tôi là luồng chính đã bị chiếm đóng bởi những thứ khác và mục tiêu của tôi là tải danh sách người bạn Facebook của bạn theo một chủ đề khác để không nặng gánh gánh nặng chính của mình –

+0

Tôi thấy, có vẻ như 'FBURLConnection' chỉ chạy một NSURLConnection trên chuỗi đó được gọi từ. Tôi đã nghĩ rằng nó sẽ chạy kết nối mạng trên một sợi nền. Nếu không, tại sao lại hiển thị một API không đồng bộ? –

+0

Vâng, đó là sự thật, tôi không nghĩ về nó và nó có vẻ hợp lý, vì vậy những gì tôi nên làm là đối xử, ví dụ như danh sách 5000 bạn bè của tôi, trong một chủ đề thứ hai. Bởi vì lệnh gọi lại này: 'startWithCompletionHandler:' được thực hiện trong hàng đợi chính nên việc xử lý danh sách sẽ được gửi đi từ hàng đợi chính này? Tôi có cách tiếp cận đúng không? –

6

Tôi gặp sự cố này một chút.

Đảm bảo bạn gửi mã trên chuỗi chính.

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

     }); 
Các vấn đề liên quan