2012-09-12 25 views
5

Chỉ trong iOS 5, một ứng dụng tôi đang làm việc có vẻ như đang giảm yêu cầu khi tôi gửi một số lượng lớn các yêu cầu không đồng bộ. Ý nghĩa lớn vẫn còn khá nhỏ - thử nghiệm với 30 ngay bây giờGiới hạn số yêu cầu NSURLConnection đồng thời trong iOS 5?

Mỗi yêu cầu sử dụng riêng NSURLConnection và dự kiến ​​sẽ trở lại tương đối nhanh (tức là 300 ms - 2s). Chúng tôi cũng giữ một kết nối mở trong một thời gian dài.

Dường như mọi kết nối thứ 5 đều không thể rời khỏi thiết bị. Nó chắc chắn không bao giờ đạt đến máy chủ, và gỡ lỗi mạng bằng cách sử dụng Charles thậm chí không hiển thị các yêu cầu đi ra ngoài.

Tôi tự hỏi liệu có ai biết giới hạn về số lượng đối tượng NSURLConnection mở đồng thời và yêu cầu hoạt động không?

Cần lưu ý rằng chúng tôi không thấy vấn đề này trong iOS 4. Có vẻ như nếu chúng ta hủy kết nối lâu dài, thì chúng tôi sẽ không yêu cầu thêm 5 lần nữa.

+2

tôi đặt mỏ NSOperations trong một NSOperationsQueue, và thường phát hành vài trăm web lấy về tại một thời điểm và không bao giờ tìm thấy trường hợp lỗi kết nối. Tôi nhận ra điều này có thể khác một chút so với những gì bạn đang làm. Bạn có thể phát triển một ứng dụng thử nghiệm mà chỉ cần lấy cùng một tập tin từ một tài khoản hộp thả xuống, và xem khi nào mọi thứ trở nên tồi tệ, nhưng tôi mong đợi con số sẽ khá lớn trước khi hệ thống ngắt kết nối. –

Trả lời

4

NSOperationQueue là cách tốt nhất để quản lý vấn đề này. Tóm lại, bạn quấn NSURLConnection trong một NSBlockOperation, sau đó thêm nó vào hàng đợi. Hàng đợi cho phép bạn thiết lập các thuộc tính khác nhau như số lượng kết nối đồng thời tối đa và cũng cung cấp cho bạn một cách dễ dàng để hủy các hoạt động đã xếp hàng đợi.

Có giới thiệu tốt về mẫu thiết kế này trong video WWDC (2012) được gọi là "Xây dựng giao diện người dùng đồng thời trên iOS".

Trong iOS 5, bạn có thể sử dụng các cuộc gọi sau đây để bắt đầu một NSURLConnection và thêm nó vào một NSOperationQueue

+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler

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