2012-04-11 30 views
12

Đây là kịch bản:Đối phó với các yêu cầu web mở async khi UIViewController được popped (AFNetworking)

-A UIViewController (A) được đẩy vào stack navigation
-Ngày viewDidLoad một GET async được gọi là sử dụng AFNetworking (một singleton AFHTTPClient được chia sẻ trong toàn bộ ứng dụng) để điền vào các phần tử người dùng khác nhau trên màn hình (nói một UILabel).
sử dụng -Các nhấn nút quay lại trước khi yêu cầu trả
-Assume điều khiển xem hoạt động khác có thể làm cho các yêu cầu, do đó bạn không thể hủy toàn bộ hoạt động mở

Vì vậy, câu hỏi # 1 là, bạn nên theo dõi các yêu cầu mở được thực hiện bởi UIViewController A và hủy bỏ những điểm nổi bật khi người dùng rời khỏi chế độ xem đó hoặc bạn có nên để họ kết thúc và bỏ qua chúng không? Vì AFNetworking sử dụng các khối, các phần tử người dùng đang được cập nhật được giữ lại bên trong khối và do đó sẽ không gây ra sự cố khi khối thành công/thất bại được thực thi sau khi khung nhìn đã được bật. Tuy nhiên, nhược điểm để bỏ qua chúng dường như là lưu lượng mạng không cần thiết.

Câu hỏi # 2 là, bạn sẽ thực thi mã để hủy các hoạt động do UIViewController A thực hiện ở đâu? viewDidDisappear dường như không đúng vì người dùng có thể đã chuyển tiếp (đẩy một khung nhìn mới vào ngăn xếp) thay vì quay lại (xuất hiện chế độ xem hiện tại), trong trường hợp đó bạn không muốn hủy yêu cầu mở vì người dùng có thể đến quay lại chế độ xem hiện tại và nó sẽ không tải lại. Tuy nhiên, tôi không nghĩ dealloc hoặc viewDidUnload sẽ được gọi trong khi yêu cầu đang thực thi vì khối sẽ giữ lại trên các phần tử người dùng vì vậy tôi không nghĩ rằng nó có thể đến đó.

Sẽ đánh giá cao suy nghĩ về điều này. Bạn nghĩ gì là thực hành tốt nhất?

+1

Lưu ý phụ: viewDidUnload không liên quan gì đến số lượng bộ nhớ giữ lại của bộ điều khiển chế độ xem. Nó được gọi khi bộ điều khiển xem muốn loại bỏ chế độ xem của nó (và có thể tải lại sau). Điều này xảy ra với bất kỳ bộ điều khiển chế độ xem màn hình ngoài nào trong một tab hoặc bộ điều khiển điều hướng khi bạn nhận được cảnh báo bộ nhớ, ví dụ. Vì vậy, nó có thể được gọi trong khi yêu cầu của bạn đang được tiến hành. – rickster

Trả lời

7

Nói chung, bạn không thực sự cần phải hủy yêu cầu khi người dùng rời khỏi trình điều khiển chế độ xem. Về mặt quản lý bộ nhớ, tham chiếu tới khối tự động sẽ ngăn chặn mọi sự cố gây ra bằng cách gửi tin nhắn đến các phiên bản được phân phối, do đó, đừng lo lắng ở đó. Theo kinh nghiệm của người dùng, tôi có thể nói rằng bạn không nên lo lắng về nó cho đến khi nó là vấn đề (chúng tôi có một chút lo ngại về việc đoán được những gì sẽ chậm trong các ứng dụng của chúng tôi). Tuy nhiên, nếu bạn đang thực hiện các yêu cầu GET lớn và tạo ra sự chậm chạp đáng chú ý, đề nghị của tôi là để có bộ điều khiển làm HTTPClient -cancelAllHTTPOperationsWithMethod:path: trong -viewDidUnload: (bất kỳ cuộc gọi lại nào khác sẽ sớm).

+1

Tại sao hủy yêu cầu trong 'viewDidUnload:'? Tôi nghĩ rằng yêu cầu nên được hủy bỏ ngay lập tức sau khi bộ điều khiển xem được xuất hiện. Cách tiếp cận tốt hơn là kiểm tra xem bộ điều khiển xem có còn trong ngăn xếp trong 'viewDidDisappear:' hay không. Nếu không, hãy hủy yêu cầu. Bạn có thể kiểm tra nó bằng cách sử dụng 'if (! [Self.navigationController.viewControllers containsObject: self]) {NSLog (@" Cancel request "); } ' – nonamelive

+0

Bạn đang suy nghĩ quá mức. Có thể có một số trường hợp việc hủy ngay lập tức có ý nghĩa hơn, nhưng vì người dùng không thể đẩy ngay lập tức sau khi bật chế độ xem, có thể không phải trả tiền quá chủ động. – mattt

0

Có lẽ bạn có thể có một singleton quản lý tất cả các công cụ mạng và chỉ đặt đại biểu của nó cho vc hiện tại (trong viewDidLoad) để bạn nhận được bất kỳ dữ liệu đến nào và gửi thông báo hủy khi vc biến mất (hoặc người nào khác để một vc khác trở thành đại biểu của nó). Hoặc singleton có thể giữ dữ liệu để truy cập bởi bất kỳ vc ở một số giai đoạn sau này. Tôi có xu hướng không đặt mã async vào VC của tôi vì lý do này.

+0

Tôi biết cách theo dõi yêu cầu hủy, câu hỏi là bạn nên hủy chúng, và nếu có, bạn nên hủy bỏ sự kiện nào (vì viewDidUnload và dealloc sẽ không được gọi trước khi yêu cầu hoàn tất). – Joel

+0

@Joel Bạn có thể kiểm tra xem trình điều khiển xem có xuất hiện trong 'viewDidDisappear:' hay không. Xin vui lòng xem bình luận tôi để lại trong câu trả lời của mattt. – nonamelive

+1

Cảm ơn.Tôi cũng đã học được sau câu hỏi này mà bạn có thể kiểm tra pop trong viewDidDisapper bằng cách làm điều này: if ([self isMovingFromParentViewController] || [self isBeingDismissed]) – Joel

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