2013-03-24 35 views
8

Tôi có một liên kết NSArray. Tôi muốn phân tích chúng thông qua API trích xuất bài viết trực tuyến (Clear Read) và với kết quả được trả lại cho mỗi bài viết (một số HTML), tôi ném nó vào một số NSString.NSURLConnection và nhiều yêu cầu không đồng bộ - có gây rối với dữ liệu được truyền không?

Vấn đề của tôi phát sinh từ thực tế là, mảng của tôi có 100 URL trong đó, tôi lặp qua mảng chụp mỗi mục vào API và lấy lại một số kết quả bằng JSON. Điều này kích hoạt như 100 NSURLConnection cuộc gọi cùng lúc một cách không đồng bộ.

Tôi không chắc đó có phải là vấn đề hay không, nhưng khi tôi cung cấp cho nó 100 URL (chuỗi thực, không có nil) dữ liệu quay lại thường có giá trị rỗng cho các khóa JSON (khi chúng nên 't) hoặc dữ liệu quay lại là nil. Ngoài ra còn có một loạt các bản sao.

Tôi có nên xử lý nhiều kết nối không đồng bộ tốt hơn tôi bây giờ không? Nếu vậy, làm thế nào?

Trả lời

8

Một vài suy nghĩ:

  1. Nếu bạn đang làm yêu cầu không đồng bộ đồng thời và đang sử dụng không đồng bộ NSURLConnection, sau đó bạn sẽ muốn xác định lớp của riêng bạn cho hoạt động tải về này để đảm bảo rằng tất cả các kết nối theo dõi các đặc tính riêng của nó. Bằng cách đó, mọi thứ có thể được đóng gói trong lớp này, nơi các đối tượng tải xuống có thể theo dõi những gì được tải xuống, những gì được phân tích cú pháp, v.v. Nếu bạn không sử dụng không đồng bộ NSURLConnection (ví dụ: bạn chỉ sử dụng dataWithContentsOfURL), nó thậm chí còn dễ dàng hơn, mặc dù bạn mất một số cập nhật tiến độ mà NSURLConnection cung cấp và/hoặc cơ hội phát trực tiếp.

  2. Để có hiệu suất tốt nhất, bạn nên thực hiện các yêu cầu đồng thời. Có nói rằng, bạn không nên có nhiều hơn bốn hoặc năm yêu cầu đồng thời đi đến bất kỳ máy chủ cụ thể. Đây là một hạn chế được áp dụng cho iOS và đặc biệt nếu bạn có kết nối mạng chậm, bạn có nguy cơ bị kết nối thời gian chờ khác.

  3. Nếu bạn đang thực hiện kiểm tra sơ bộ trên trình giả lập, bạn có thể muốn đảm bảo bạn thử "điều hòa liên kết mạng". Nó là một phần của "Phần cứng IO Công cụ cho Xcode", có sẵn tại Downloads for Apple Developers. Có những vấn đề (chẳng hạn như các vấn đề thời gian chờ nói trên nếu bạn có quá nhiều yêu cầu đồng thời tới một máy chủ cụ thể) chỉ hiển thị trong kết nối chậm.

  4. Có nói rằng, bạn cũng muốn đảm bảo kiểm tra giải pháp của mình trên thiết bị có tốc độ mạng thực tế. Thật dễ dàng để chạy thành công các tác vụ song song một cách thành công trên trình mô phỏng quá tham lam cho thiết bị. Việc giới hạn số lượng phiên đồng thời thành năm sẽ làm giảm vấn đề tài nguyên này, nhưng nó phải là một phần của chiến lược thử nghiệm của bạn.

  5. Tôi đồng ý với JRG-Developer, rằng bạn nên xem xét các khuôn khổ đã được thiết lập, chẳng hạn như AFNetworking.Đảm bảo đặt maxConcurrentOperationCount cho queue của AFHTTPClient, tuy nhiên, nếu xếp hàng 100 hoạt động cộng.

  6. Tôi không biết có bao nhiêu dữ liệu mà 100 yêu cầu của bạn đòi hỏi, nhưng được cảnh báo rằng quá trình phê duyệt ứng dụng đã được biết là từ chối ứng dụng yêu cầu mạng bất thường trên mạng di động. Điều gì cấu thành hoạt động mạng di động quá mức không được nêu rõ trong nguyên tắc đánh giá ứng dụng, mặc dù Avoiding iPhone App Rejection From Apple đã tuyên bố rằng bạn nên đảm bảo rằng bạn không vượt quá 4,5mb trong 5 phút. Bạn có thể sử dụng Reachability để xác định loại mạng bạn đang sử dụng và có thể cảnh báo người dùng nếu họ đang ở trên mạng di động (nếu lượng dữ liệu đạt đến ngưỡng này).

+0

câu trả lời rất hay –

3

Bạn đã cân nhắc sử dụng khung bên thứ ba - chẳng hạn như AFNetworking - và hạn chế số lượng cuộc gọi không đồng bộ xảy ra cùng một lúc? Có lẽ điều này có thể giúp/giải quyết vấn đề của bạn.

Cụ thể, bạn có thể xem xét tạo một lớp học networking manager tạo và quản lý AFHTTPClient(s), do đó quản lý AFHTTPRequestOperations, cho mỗi điểm cuối (URL cơ sở) mà bạn nhấn.

+0

Tôi có chút mới mẻ với điều này mô tả, vì vậy bạn có thể đưa ra đoạn cuối cùng nhiều hơn một chút cho tôi không? – user212541

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