Tôi muốn quấn một API async mà trông như thế này:cách quấn một phương pháp không đồng bộ mà phải mất một khối và biến nó đồng bộ trong quan c
[someObject completeTaskWithCompletionHandler:^(NSString *result) {
}];
thành một phương pháp đồng bộ mà tôi có thể gọi như
nàyNSString *result = [someObject completeTaskSynchronously];
Làm cách nào để thực hiện việc này? Tôi đã làm một số đọc doc và tìm kiếm google, và cố gắng sử dụng "dispatch_semaphore" làm cố gắng để đạt được nó như vậy:
-(NSString *) completeTaskSynchronously {
__block NSString *returnResult;
self.semaphore = dispatch_semaphore_create(0);
[self completeTaskWithCompletionHandler:^(NSString *result) {
resultResult = result;
dispatch_semaphore_signal(self.semaphore);
}];
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
return resultResult;
}
Nhưng điều này không có vẻ làm việc, nó về cơ bản chỉ dừng ở dispatch_semaphore_wait. Thực hiện không bao giờ đạt đến khối bên trong mà làm _signal. Bất cứ ai cũng có mã ví dụ về cách làm điều này? Tôi nghi ngờ rằng các khối đã được trên một chủ đề khác nhau các chủ đề chính? Ngoài ra, giả sử tôi không có quyền truy cập vào mã nguồn đằng sau phương thức async. Cảm ơn!
Nếu trình xử lý hoàn thành được thực hiện trên cùng một luồng gọi dispatch_semaphore_wait, bạn thực sự bế tắc chuỗi vì khối hoàn thành không thể thực thi cho đến khi thoát khỏi chuỗi chờ. Bạn đang cố gắng làm điều này trên chủ đề chính? Nó là tốt hơn để không chặn các chủ đề chính trong thời gian dài bởi vì nó phải liên tục gửi tin nhắn. – yurish
Nếu, như nghi ngờ bởi @yurish, bạn xử lý đã được xếp hàng đợi vào luồng công văn chính, bạn không được chờ đợi. Bạn phải xây dựng dòng mã của bạn như một máy trạng thái và làm bất cứ điều gì cần phải được thực hiện với kết quả trong trình xử lý hoàn thành. –
Không có cách chung để làm điều này. Như những người khác đã nói, nếu một phần nào đó của tác vụ không đồng bộ hoạt động bằng cách đặt các sự kiện trên vòng lặp chạy, bạn sẽ luôn luôn bế tắc. Bạn đang thực sự * cố gắng đạt được điều gì? Có thể có một cách khác để cấu trúc mã của bạn. – JeremyP