2011-10-18 34 views
29

Tôi đang xem lớp NSURLConnection có thể được sử dụng để thiết lập kết nối đồng bộ hoặc không đồng bộ với URL và sau đó truy xuất dữ liệu của nó ... rất nhiều thay đổi đã được thực hiện cho lớp này IOS 5 và tôi đã thấy họ giới thiệu một số giao thức chính thức liên quan đến xác thực hoặc tải xuống, nhưng tôi không thấy, ví dụ, nếu thông báo connection:didReceiveResponse: (trước đó đã được gửi cho đại biểu và rằng nó không có sẵn) vẫn còn có sẵn trong một số giao thức .. Làm cách nào để bạn triển khai kết nối không đồng bộ và truy xuất, ví dụ: tiêu đề HTTP ngay khi nhận được Phản hồi? Tôi chắc chắn có một cách tốt hơn so với việc sử dụng NSURLConnection cùng với các thông báo connection:didReceiveResponse: .. các phương thức như stringWithContentsOfURL luôn tải nội dung một cách đồng bộ? Bạn sử dụng gì để triển khai tải xuống không đồng bộ trong ứng dụng của mình tránh các phương pháp không dùng nữa và phản ứng lại các sự kiện như trả lời _http received_m etc? Bạn có chạy các bản tải xuống đồng bộ trong các tác vụ nền, nếu có thể không?Phương pháp NSURLConnection không còn khả dụng trong IOS5

+0

Như vậy, câu hỏi của bạn nên được chia thành nhiều câu hỏi: có khả năng năm câu hỏi trong câu hỏi của bạn. Câu trả lời của tôi giải quyết những gì tôi cho là vấn đề lớn nhất của bạn, cụ thể là loại bỏ rõ ràng các phương thức ủy nhiệm kết nối đã có sẵn trong iOS 4.3. –

Trả lời

68

NSURLConnectionDelegate đã trở thành giao thức chính thức (đó là giao thức không chính thức trong các phiên bản trước). Trong giao thức này, (không được hỗ trợ) phương pháp sau đây được khai báo:

  • connection:didFailWithError:
  • connectionShouldUseCredentialStorage:
  • connection:willSendRequestForAuthenticationChallenge:

Bên cạnh đó, có hai subprotocols rằng phù hợp với NSURLConnectionDelegate:

NSURLConnectionDataDelegate được sử dụng cho các đại biểu tải dữ liệu vào bộ nhớ và khai báo metho sau ds, một số trong đó tôi chắc chắn bạn sẽ tìm thấy quen thuộc:

  • connection:willSendRequest:redirectResponse:
  • connection:didReceiveResponse:
  • connection:didReceiveData:
  • connection:needNewBodyStream:
  • connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:
  • connection:willCacheResponse:
  • connectionDidFinishLoading:

NSURLConnectionDownloadDelegate được sử dụng cho các đại biểu rằng lưu trữ dữ liệu trực tiếp đến một tập tin trên đĩa, và tuyên bố các phương pháp sau:

  • connection:didWriteData:totalBytesWritten:expectedTotalBytes:
  • connectionDidResumeDownloading:totalBytesWritten:expectedTotalBytes:
  • connectionDidFinishDownloading:destinationURL:

Như bạn có thể nhìn thấy , bạn vẫn có thể sử dụng các đại biểu trước đây của bạn, có thể với một số sửa đổi nhỏ.

Để biết thêm thông tin, hãy xem iOS 4.3 to iOS 5.0 API Differences document và NSURLConnection.h trong cài đặt Xcode cục bộ của bạn. Khi một phiên bản SDK mới được phát hành, sẽ không có gì lạ khi tài liệu bên trong tệp tiêu đề đáng tin cậy hơn tài liệu có sẵn trên thư viện dành cho nhà phát triển. Phải mất một thời gian để sau này được cập nhật.

+0

Cảm ơn bạn ... Tôi vừa thấy tài liệu tham khảo chưa được cập nhật, vì vậy tài liệu khác biệt API và tệp tiêu đề là điểm khởi đầu tốt. Tôi nghĩ tôi đã nhìn thấy một nơi nào đó (tôi không thể tìm thấy tài liệu này ngay bây giờ ..) tài liệu nói rằng thường ứng dụng của bạn không nên triển khai giao thức NSURLConnectionDataDelegate ... cho tôi biết nếu tôi sai: nếu bạn cần triển khai thanh tiến trình tải xuống, bạn không nên sử dụng didReceiveData để hiểu khi nào ' đã tải xuống một chút dữ liệu hoặc tôi đã hiểu lầm cách hoạt động của andReceiveData và khi nào nó được gửi? –

+0

@Gianni Có, '-… didReceiveData:' được gửi tới đại biểu để thông báo rằng dữ liệu đã được nhận. Bên cạnh việc lưu trữ các dữ liệu đó, bạn có thể sử dụng nó để cập nhật thanh tiến trình tải xuống. –

+0

FYI, tính đến ngày 04/08/12, tài liệu SDK 5.1 vẫn không có tham chiếu đầy đủ về NSURLConnectionDataDelegate (không trực tuyến hay trong SDK). –

2

Tôi vừa gặp sự cố tương tự này. Dường như gửi yêu cầu không đồng bộ được đơn giản hơn với các khối và NSOperationQueue.

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

Điều này có nghĩa là đại biểu hiện chỉ được sử dụng cho các vấn đề xác thực và thất bại.

+0

Cảm ơn bạn, tôi không thể tìm thấy nó trong tài liệu tham khảo, có thể nó sẽ sớm được cập nhật. –

+1

Thông thường, nó hiện đã được cập nhật. Tuy nhiên, hãy chú ý vì phương pháp này không khả dụng trên iOS 4.3. Tóm lại: bạn sẽ cần triển khai cả hai cách để tương thích với iOS 4.3 và iOS 5.0. –

2

NO! Chúng KHÔNG bị giới hạn sử dụng cho các vấn đề xác thực và lỗi nếu bạn xem kỹ thông qua thư viện của Apple.

Kể từ khi giới thiệu +(void)sendAsynchronousRequest:queue:completionHandler: đến đối tượng lớp NSConnection, Nhiều điều có thể thực hiện như nhiều NSConnectionDelegate phương pháp như trước bây giờ có thể được sử dụng trong các giao thức chính thức được gọi là "NSConnectionDataDelegate" & NSConnectionDownloadDelegate, mở một phòng mới để thêm tính năng hơn để NSURLConnection phương pháp. (từ iOS5 trở lên)

Vì vậy, tôi nghĩ rằng đó là một cải tiến, không hạn chế việc sử dụng chúng.

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