2013-10-30 14 views
18

Với NSURLSession mới, bây giờ có một timeoutIntervalForRequest trên đối tượng NSURLSessionConfiguration được sử dụng để tạo phiên.NSURLSessionConfiguration timeoutIntervalForRequest vs NSURLSession timeoutInterval

Nhưng vẫn còn một khoảng thời gian chờ trên đối tượng NSURLRequest có thể được sử dụng để tạo NSURLSessionTask trong phiên.

Câu hỏi của tôi là, nếu cấu hình có timeoutIntervalForRequest được đặt thành 30, nhưng việc sử dụng NSURLRequest để tạo tác vụ có khoảng thời gian chờ là 60, khoảng thời gian chờ nào sẽ thực sự được sử dụng?

Trả lời

17

Khi điều tra của tôi trên iOS 7.0.3, timeoutInterval cho NSURLRequest không nhận được bất kỳ hiệu ứng nào khi được sử dụng với NSURLSession.

Cho dù bạn đặt timeoutIntervalForRequest cho NSURLSessionConfiguration hay không, timeoutInterval chỉ bị bỏ qua.

Bạn có thể sử dụng ứng dụng mẫu nhỏ bé NetworkTimeoutSample để kiểm tra hành vi này.

Khi bạn đặt 1 cho trường 'URLReq', ảnh hưởng đến timeoutInterval cho NSURLRequest, sau đó nhấp vào nút 'NSURLSession With URLRequest', phiên của bạn sẽ không nhận được lỗi hết thời gian chờ.

Bạn cũng có thể nhận ra bạn nên đặt timeoutIntervalForResource, thay vì timeoutIntervalForRequest cho NSURLSession nếu bạn muốn để có hiệu ứng thời gian chờ tương tự cho timeoutInterval của NSURLRequest.

Nếu bạn đặt cả hai giá trị timeoutIntervalForRequesttimeoutIntervalForResource cho NSURLSessionConfiguration, giá trị nhỏ hơn sẽ bị ảnh hưởng (tôi cảm thấy hành vi này khác với tài liệu API hiện tại).

Không có tài liệu nào về các thông số kỹ thuật đó, vì vậy nó có thể được thay đổi trên phiên bản iOS trong tương lai.

+0

Xin chào, câu trả lời của bạn sẽ gửi cho tôi đúng hướng. Nó làm cho tôi nhận ra rằng timeoutIntervalForRequest và timeoutIntervalForResource nên được sử dụng. Tuy nhiên, tôi dường như không bao giờ nhìn thấy bất kỳ callbacks được gọi sau khi sự chậm trễ thời gian chờ khi sử dụng NSURLSessionDownloadTask trong nền. Cuộc gọi lại nào được gọi khi bạn hết thời gian chờ? Có phải nó vẫn là URLSession: task: didCompleteWithError:? –

+0

Ok, có vẻ như nó hoạt động khi không sử dụng các phiên nền ... Nhưng không hoạt động khi sử dụng các phiên nền ... –

+0

Tôi muốn khoảng thời gian của dịch vụ web của tôi là 180 giây (3 phút). về NSURLSESSION và timeoutIntervalForRequest và timeoutIntervalForResource của nó, tôi đã thử sử dụng chúng, một lần nữa mang lại kết quả tương tự như timeOutInterval của NSMutableURLRequest.ie, tôi thiết lập khoảng thời gian trong 180 giây như sessionConfig.timeoutIntervalForRequest = 180.0; sessionConfig.timeoutIntervalForResource = 180.0; nhưng tôi nhận được cuộc gọi thất bại trở lại sau 75 giây hoặc tại một khoảng thời gian ngẫu nhiên, nói rằng 'Yêu cầu đã hết thời gian'. Có bất kỳ ý tưởng về điều này? – XiOS

4

Vì iOS8, NSUrlSession ở chế độ nền không gọi phương thức ủy nhiệm này nếu máy chủ không phản hồi. -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error Tải xuống/tải lên vẫn không hoạt động vô thời hạn. Đại biểu này được gọi trên iOS7 với lỗi khi máy chủ không phản hồi.

Nói chung, phiên nền NSURLSession không làm hỏng tác vụ nếu xảy ra sự cố trên dây. Thay vào đó, nó tiếp tục tìm kiếm một thời điểm tốt để chạy yêu cầu và thử lại tại thời điểm đó. Điều này tiếp tục cho đến khi hết thời gian chờ tài nguyên (nghĩa là giá trị của thuộc tính timeoutIntervalForResource trong đối tượng NSURLSessionConfiguration mà bạn sử dụng để tạo phiên). Giá trị mặc định hiện tại cho giá trị đó là một tuần! Nói cách khác, hành vi thất bại cho một thời gian chờ trong iOS7 là không chính xác. Trong bối cảnh của một phiên nền, nó là thú vị hơn để không thất bại ngay lập tức vì các vấn đề mạng. Vì vậy, kể từ iOS8, nhiệm vụ NSURLSession tiếp tục ngay cả khi nó gặp thời gian chờ và mất mạng. Nó tiếp tục tuy nhiên cho đến khi timeoutIntervalForResource đạt được.

Vì vậy, về cơ bản timeoutIntervalForRequest sẽ không hoạt động trong Phiên nền nhưng timeoutIntervalForResource sẽ.

Tôi nhận được câu trả lời này từ một trong các thành viên của Apple Staff tại developer forum. Ngoài ra, tôi đã xác minh điều này bằng cách thực hiện.

+1

Tôi đang sử dụng NSURLSession để kiểm tra xem một url nhất định có còn hoạt động hay bị hỏng hay không, bất kỳ đề xuất nào về thời gian nào tôi nên đặt 'timeoutIntervalForResource' thành? Mục tiêu của tôi là đặt nó sao cho thời gian tối thiểu tuyệt đối cần thiết để xác định xem url có đang hoạt động hay không? – GarySabo

+1

Trong các thử nghiệm của tôi, nếu bạn đặt 'timeoutInterval' thành 15 giây cho' NSURLRequest' và 'NSURLSession' là phiên nền, iOS sẽ tiếp tục thử lại xấp xỉ. cứ 15 giây cho đến khi 'timeoutIntervalForResource' đạt được. Nó sẽ xảy ra, tất nhiên, nếu iOS nghĩ rằng mạng của bạn là tốt. Không gọi lại sẽ được gọi - đó là sự thật. Thử nghiệm trên iOS 9.2/ –

+0

@GarySabo: Tôi nghĩ rằng bạn nên sử dụng mô-đun khả năng kết nối. –

2

Dường như mọi thứ đã thay đổi kể từ khi n-miyo kiểm tra.

apple documentation cho biết giá trị NSURLRequest sẽ ghi đè cấu hình phiên.

In some cases, the policies defined in this configuration may be overridden by policies specified by an NSURLRequest object provided for a task. Any policy specified on the request object is respected unless the session’s policy is more restrictive. For example, if the session configuration specifies that cellular networking should not be allowed, the NSURLRequest object cannot request cellular networking.

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