2012-09-02 52 views
5

Sự khác biệt giữa việc thêm một thao tác thực hiện yêu cầu NSURLConnection đồng bộ trong NSOperationQueue (hoặc yêu cầu đồng bộ từ một chủ đề (không phải chủ đề chính)) VÀ yêu cầu không đồng bộ từ chuỗi chính ?Yêu cầu đồng bộ NSURLConnection từ yêu cầu đồng bộ so với yêu cầu không đồng bộ

Cả hai sẽ không chặn luồng chính vì vậy giao diện người dùng sẽ vẫn đáp ứng nhưng có lợi thế nào khi sử dụng ứng dụng này qua người khác không? Tôi biết trong phương pháp sau này tôi có thể theo dõi tiến độ yêu cầu vv nhưng giả sử rằng tiến bộ và các công cụ HTTP khác không quan trọng ở đây.

Trả lời

2

Yêu cầu không đồng bộ được lên lịch trên vòng lặp chạy và thiết lập dưới dạng nguồn vòng lặp chạy, chỉ kích hoạt mã tự động khi có dữ liệu nhận được từ mạng (như bất kỳ nguồn socket nào).

Yêu cầu đồng bộ chạy trên NSThread độc quyền một chuỗi để giám sát dữ liệu đến, nói chung là quá mức cần thiết.

Bạn luôn có thể hủy NSURLConnection ngay cả khi nó đã được thực hiện không đồng bộ, sử dụng phương thức cancel.

Tôi đặt cược bằng cách sử dụng API mới cho phép gửi một yêu cầu không đồng bộ trên một NSOperationQueue (+sendAsynchronousRequest:queue:completionHandler:) sử dụng GCD dưới mui xe và dispatch_source_create, hoặc một cái gì đó tương tự, để nó hành xử theo cách tương tự như khi một NSURLConnection được lên kế hoạch trên chạy vòng lặp, tránh sử dụng một chuỗi bổ sung (xem các video WWDC'12 giải thích tại sao luồng là ác và cách sử dụng của chúng sẽ được giảm thiểu), sự khác biệt chỉ là cho phép bạn sử dụng một khối để được thông báo sau khi hoàn thành thay vì sử dụng các đại biểu cơ chế.

Một số năm trước, tôi đã tạo một lớp nhúng NSURLConnection cuộc gọi không đồng bộ và quản lý ủy quyền vào API khối đẹp (xem OHURLLoader trên github của tôi) giúp bạn sử dụng dễ dàng hơn (cảm thấy tự do để xem). Tôi đặt cược API mới sử dụng NSOperationQueue s sử dụng nguyên tắc tương tự, vẫn thực hiện yêu cầu không đồng bộ trên runloop nhưng cho phép bạn sử dụng các khối thay vì phải triển khai đại biểu.

2

Vị trí lịch sử là có lợi thế về tiêu thụ điện năng và do đó, thời lượng pin, trong các yêu cầu không đồng bộ - có lẽ bao gồm cả phương pháp tiếp cận đại biểu cũ và phương pháp tiếp cận dựa trên khối mới.

+0

Cảm ơn, bạn có một điểm :) – msk

+0

Điều đó có ý nghĩa. * Là gì * cách tiếp cận dựa trên khối mới, cụ thể là xin vui lòng? Không tìm kiếm mã, chỉ cần hỏi Google để tôi có thể tìm kiếm một số tài liệu. – Madbreaks

+2

@ Phá vỡ nó là 'NSURLConnection + sendAsynchronousRequest: queue: completionHandler:'. – Tommy

5

Chúng rất giống nhau. Vấn đề lớn nhất với các yêu cầu đồng bộ là chúng không thể dễ dàng bị hủy bỏ. Tùy thuộc vào ứng dụng của bạn, đó có thể là một vấn đề. Hãy tưởng tượng bạn đang tải xuống một tài liệu lớn và người dùng di chuyển sang một màn hình khác để bạn không còn cần thông tin đó nữa. Trong trường hợp của chúng tôi, tôi thực sự chọn thực hiện NSURLConnections không đồng bộ trên NSThread phụ, điều này có thể quá mức đối với một số ứng dụng. Nó phức tạp hơn, nhưng nó cho chúng ta khả năng hủy bỏ cả hai yêu cầu và giải mã dữ liệu JSON/XML/hình ảnh trên các luồng phụ để chúng không ảnh hưởng đến tương tác của người dùng chủ đề chính.

+0

cảm ơn câu trả lời của bạn – msk

Các vấn đề liên quan