2013-10-01 19 views
12

Tôi hiện đang trong quá trình thiết kế hệ thống tải nhiều hình ảnh lên máy chủ từ một ứng dụng. Các tệp sẽ được lưu trữ trên thiết bị cục bộ và ý tưởng hiện tại là chia chúng thành các phần và sau đó tải chúng lên từng đoạn một, gửi thư thành công trước khi tải lên bản tiếp theo.iOS 7 - NSURLSession Tải lên Resumable

Quá trình này phải liền mạch cho người dùng, họ nên nhấn nút để gửi tất cả hình ảnh và sau đó có thể đóng ứng dụng và để tiếp tục ở chế độ nền. Với iOS 7, tôi đã thấy rằng bạn có thể chuyển các video tải lên của mình lên API NSURLSession mới và giải quyết vấn đề tải lên độc lập với ứng dụng của bạn.

Tôi đã tự hỏi liệu có ai biết mức độ tin cậy của chuyển khoản này không. Nếu tôi chuyển toàn bộ hình ảnh, điều gì sẽ xảy ra nếu kết nối internet giảm một nửa? Dịch vụ chuyển nền có thử lại sau không? Ý tưởng là chúng ta có thể tải lên một hình ảnh, và nếu nó thất bại một nửa thông qua đó chúng ta chỉ có thể tiếp tục từ thời điểm đó sau này khi kết nối được nối lại.

Một ý tưởng chúng tôi có là chia nhỏ các tệp thành các phần và sau đó chuyển tất cả các đoạn như NSURLSessionUploadTasks riêng biệt và giả định rằng tất cả chúng sẽ được gửi đến máy chủ cuối cùng.

Một là để gửi các đoạn đầu tiên sử dụng:

uploadTaskWithRequest:fromData:completionHandler: 

Và sau đó trong completitionHandler để sau đó gửi đoạn tiếp theo. Vấn đề của tôi với điều này là nếu ở chế độ nền các đoạn tiếp theo sẽ có nó

@property BOOL discretionary = true 

có nghĩa là nó sẽ chỉ gửi qua WiFi khi cắm vào. Tôi cần làm việc này trên tất cả các mạng và có thể đối phó với interuptions.

Tôi không muốn bất kỳ mã nào, chỉ cần tư vấn nếu đây là cách chính xác để thực hiện việc này.

Trả lời

7

tôi sẽ cố gắng trả lời một số câu hỏi của bạn

Nếu upload của bạn dừng lại giữa chừng do một lỗi, ứng dụng của bạn nên được đưa ra trong nền và bạn sẽ có thể để thực hiện các xử lý lỗi cần thiết. Trong trường hợp của bạn, nếu máy chủ của bạn hỗ trợ tải lên tiếp tục, bạn sẽ có thể nhận được bù đắp và sau đó thiết lập một nhiệm vụ khác để tải lên đoạn tiếp theo.

Nếu bạn đang sử dụng NSURLSession được định cấu hình để chạy trong nền thì bạn không thể thiết lập nhiệm vụ tải lên với trình xử lý hoàn thành và bạn không thể tải lên khối của mình bằng đối tượng NSData. lựa chọn duy nhất của bạn là để viết các khối lên đĩa và sau đó sử dụng

uploadTaskWithRequest:fromFile: 

Tôi nghĩ rằng đây có ý nghĩa bởi vì một đối tượng NSData cư trú trong bộ nhớ ứng dụng và cập nhật nền được thực hiện bởi một daemon bên ngoài nên nó sẽ chỉ là quyền tải lên tệp (từ hộp cát của người dùng). Ngoài ra, thay vì sử dụng trình xử lý hoàn tất, bạn sẽ cần phải sử dụng các đại biểu để lắng nghe các cuộc gọi lại (trong khi ứng dụng ở phía trước).

Nếu bạn vẫn thích sử dụng một đối tượng NSData, sau đó là một giải pháp thay thế sẽ là để tạo ra một nhiệm vụ sử dụng

downloadTaskWithRequest: 

Bằng cách này bạn có thể thiết lập các đối tượng NSData trong cơ thể của các yêu cầu và thông qua đó cùng trong request.You sẽ cần phải thiết lập yêu cầu của bạn bằng cách sử dụng NSURLMutableRequest để đạt được điều này.

Đối với thuộc tính tùy ý, vì thuộc tính mặc định là TRUE nên tôi không chắc chắn liệu chúng tôi có thể làm được gì nhiều về điều đó hay không. Nó nói rằng chuyển giao là nhiều khả năng xảy ra trên Wi-Fi và khi được cắm vào vì vậy có thể có một cơ hội nhỏ có thể xảy ra trên di động nhưng không dùng từ ngữ của tôi cho nó tôi chỉ đoán.

+0

nếu tôi đang sử dụng đại biểu, khi ảnh trước đó được tải lên, trong cuộc gọi lại đại biểu hoàn thành, tôi có thể xếp hàng tác vụ tải lên ảnh tiếp theo. đúng không? -thanks –

+0

Bạn nói đúng, bạn có thể làm điều đó. –

+2

@ErbenMo Hãy cẩn thận, Nếu chuyển nền được bắt đầu trong khi ứng dụng ở chế độ nền, thuộc tính tùy ý của đối tượng cấu hình được coi là đúng. Khi cờ này được đặt, chuyển có nhiều khả năng xảy ra khi được cắm vào nguồn và trên Wi-Fi. Giá trị này là false theo mặc định. Nếu một tác vụ được khởi động trong khi ứng dụng ở chế độ nền, nhiệm vụ đó được coi là mặc dù tùy ý là đúng, bất kể giá trị thực của thuộc tính này. Do đó, các video tải lên tiếp theo của bạn có thể không xảy ra cho đến khi bạn sử dụng WiFi và được cắm. –

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