2013-02-13 37 views
6

Thông thường, trong các Ứng dụng iOS của tôi sử dụng khá nhiều yêu cầu HTTP để liên lạc với máy chủ, tôi thêm NSBlockOperation vào NSOperationQueue toàn cầu của ứng dụng và sau đó tạm ngưng và cho phép hàng đợi khi ứng dụng phát hiện sự thay đổi trạng thái kết nối internet, do đó, lưu bất kỳ yêu cầu nào hiện có trong hàng đợi cho đến khi hàng đợi không được treo. Tuy nhiên, tôi không hoàn toàn chắc chắn rằng theo cách này, bất kỳ hoạt động nào hiện đang chạy sẽ bị dừng lại và sau đó được thêm lại vào đầu hàng đợi.Cách tốt nhất để xử lý thay đổi kết nối internet với mạng HTTP

Câu hỏi của tôi là: có cách nào tốt hơn để đối phó với một sự thay đổi trong tình trạng mạng khi bạn đang làm việc với yêu cầu HTTP đến một ví dụ máy chủ từ xa ở tạm dừng, tiếp tục, hủy bỏ yêu cầu vv ...

+0

Cách easist, cũng được sử dụng nhiều nhất và đủ để bỏ qua vấn đề. Tạo yêu cầu, gửi chúng đến máy chủ và nếu kết nối không thành công, hiển thị lỗi cho người dùng. Chỉ có bấy nhiêu thôi. Bạn có thể thử lại một kết nối khi nó không thành công nhưng tôi sẽ không khuyên bạn nên làm điều đó nhiều hơn một lần cho một yêu cầu. – Sulthan

+0

@Sulthan cách khác, nếu các yêu cầu là nội bộ, ví dụ: phân tích? –

Trả lời

2

Bạn có thể sử dụng lớp Reachability để phát hiện khi trạng thái mạng thay đổi để tránh gửi yêu cầu. Điều này được dựa trên và cập nhật từ một số sample code provided by Apple. Điều này sẽ cho bạn biết khi nào kết nối internet thay đổi mà không cần bỏ phiếu.

Theo tôi biết đây là cách tốt nhất để phát hiện tính khả dụng của mạng. Bạn sẽ nhận được thông báo tức thì khi mạng khả dụng trở lại. Tôi tin rằng nó thậm chí còn cho bạn biết loại kết nối nào có sẵn (WiFi hoặc Cellular).

Nếu kết nối bị ngắt khi thực hiện yêu cầu, bạn sẽ phải xử lý tình trạng đó như hiện tại.

0

Just suy nghĩ của tôi - bạn nên thêm hủy vào hoạt động của mình (theo cách thủ công) like here. Khi bạn phát hiện các thay đổi trạng thái mạng (không có kết nối), bạn có thể hủy các hoạt động hiện tại, tạm dừng hàng đợi, thông báo cho một số người quản lý để nó có thể lên lịch lại các hoạt động. Khi mạng khả dụng, hãy tiếp tục hàng đợi.

+0

Đó là những gì tôi đang làm vào lúc này. –

+0

Nó không rõ ràng từ câu hỏi của bạn nếu bạn đã thêm cơ chế hủy bỏ để hoạt động của bạn. Khi bạn tạm ngừng hoạt động hàng đợi đã chạy không bị ảnh hưởng theo mặc định. –

+0

Ah, tôi hiểu rồi.Vì vậy, để làm cho nó rõ ràng hơn, các hoạt động chạy nên được theo dõi, và hủy bỏ khi có một sự thay đổi trong kết nối internet, và sau đó lại được thêm vào đầu hàng đợi sau đó được gửi một lần nữa khi có kết nối internet có sẵn? –

0

Giao dịch chỉ dành cho mục đích này. Bạn cần thực hiện các cuộc gọi ws của mình nguyên tử, tức là bạn bắt đầu một giao dịch, gọi điện, nhận phản hồi và cam kết giao dịch. Sau đó, bạn có thể chắc chắn rằng nhiệm vụ của bạn được hoàn thành.

Trong trường hợp khác, bạn lại bắt đầu giao dịch, thực hiện cuộc gọi, gọi điện không thành công và bạn không nhận được phản hồi, vì bất kỳ lý do gì và bạn quay lại giao dịch và đăng nhập/báo cáo tình huống này. Bạn chỉ cần chắc chắn rằng nếu bạn thực sự không thể bỏ lỡ các cuộc gọi ws.

0

Như Luke đề xuất, Apple sample là cách tốt nhất để xử lý việc này. Nhưng tôi cũng muốn giải quyết nhu cầu phát hiện thay đổi của bạn trong kết nối mạng. Điều này được xử lý bằng cách quan sát thông báo có tên là kReachabilityChangedNotification.

Nói cách khác, điều khiển xem của bạn hoặc mã đại biểu phải có mảnh sau đây để xử lý reachability mạng (đọc "kết nối") thay đổi:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil]; 

//Called by Reachability whenever status changes.  
- (void) reachabilityChanged: (NSNotification*)note  
{  
     Reachability* curReach = [note object];   
     //TODO: Your specific handling. 
} 
Các vấn đề liên quan