2013-06-20 26 views
46

AFNetworking có gọi khối hoàn thành trên luồng chính không? hoặc là nó được gọi là nền, yêu cầu tôi gửi các cập nhật giao diện người dùng của tôi theo cách thủ công đến chuỗi chính?Các khối thành công/thất bại AFNetworking được gọi trên luồng chính?

Sử dụng mã thay lời, đây là đoạn code ví dụ từ AFNetworking documentation với cuộc gọi đến NSLog thay thế bằng một bản cập nhật giao diện người dùng:

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    self.label.text = JSON[@"text"]; 
} failure:nil]; 

nó nên được viết như thế thay vì điều này?

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.label.text = JSON[@"text"]; 
    }); 
} failure:nil]; 
+0

@tdarr tất cả mã nguồn có sẵn, hãy xem và bạn có thể biết tất cả – onmyway133

Trả lời

24

Trong AFNetworking 2, AFHTTPRequestOperationManager có thuộc tính completionQueue.

Hàng đợi công văn cho các hoạt động yêu cầu completionBlock. Nếu NULL (mặc định), hàng đợi chính được sử dụng.

#if OS_OBJECT_USE_OBJC 
    @property (nonatomic, strong, nullable) dispatch_queue_t completionQueue; 
    #else 
    @property (nonatomic, assign, nullable) dispatch_queue_t completionQueue; 
    #endif 

Trong AFNetworking 3, tài sản completionQueue đã được chuyển đến AFURLSessionManager (mà AFHTTPSessionManager kéo dài).

Hàng đợi công văn cho completionBlock. Nếu NULL (mặc định), hàng đợi chính được sử dụng.

@property (nonatomic, strong) dispatch_queue_t completionQueue; 
@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue; 
+3

Điều này nên được chấp nhận câu trả lời! – XeNoN

+0

Tôi đồng ý! Tôi đã chỉnh sửa câu trả lời để bao gồm AFNetworking 3 và thêm liên kết vào nguồn của cả hai phiên bản. – thomasd

+0

@thomasd cảm ơn. Có một số từ chối trong bản chỉnh sửa của bạn, vì vậy tôi không thể chấp nhận, nhưng tôi chỉ sao chép lại. – onmyway133

41

Họ được gọi vào hàng đợi chính, trừ khi bạn explictly đặt hàng đợi trên AFHTTPRequestOperation, như thể hiện trong setCompletionBlockWithSuccess:failure từ AFHTTPRequestOperation.m

self.completionBlock = ^{ 
    if (self.error) { 
     if (failure) { 
      dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{ 
       failure(self, self.error); 
      }); 
     } 
    } else { 
     if (success) { 
      dispatch_async(self.successCallbackQueue ?: dispatch_get_main_queue(), ^{ 
       success(self, self.responseData); 
      }); 
     } 
    } 
}; 
+0

Cảm ơn! Tôi đoán tôi có thể đã đọc nguồn ... – thomasd

+0

Tốt để biết có lẽ nên đã kiểm tra và không giả định họ chỉ thực hiện chúng trên cùng một chủ đề theo yêu cầu –

5

Như mọi người đều giải thích, đó là trong mã nguồn của AFNetworking, như đối với cách làm như thế,

AFNetworking 2.xx:

// Create dispatch_queue_t with your name and DISPATCH_QUEUE_SERIAL as for the flag 
dispatch_queue_t myQueue = dispatch_queue_create("com.CompanyName.AppName.methodTest", DISPATCH_QUEUE_SERIAL); 

// init AFHTTPRequestOperation of AFNetworking 
operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

// Set the FMDB property to run off the main thread 
[operation setCompletionQueue:myQueue]; 

AFNetworking 3.xx :

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init]; 
[self setCompletionQueue:myQueue]; 
Các vấn đề liên quan