2012-02-06 26 views
18

Tôi đã tìm kiếm theo nghĩa đen hàng tuần để tìm câu trả lời hoặc một ví dụ về cách thực hiện việc này.Làm thế nào một kết nối có thể bắt đầu với NSURLConnection trong khi ở nền trước được tiếp tục trong nền?

Tất cả các ví dụ/hướng dẫn cho NSURLConnection cho thấy nó bắt đầu ở nền trước hoặc bắt đầu nền, ditto tất cả các ví dụ cho beginBackgrounTaskWithExpirationHandler: hiển thị cách bắt đầu tác vụ nền sau khi nhập nền.

Theo như tôi có thể nói không có gì trên mạng hoặc sách hiển thị cách bắt đầu kết nối trong khi ở nền trước và sau đó nếu kết thúc không tiếp tục trong nền.

Câu trả lời cho câu hỏi này không thực sự trả lời câu hỏi:

How should beginbackgroundtaskwithexpirationhandler: be dealt with for an NSUrlConnection that is already in progress?

Nếu bạn đọc referened Ngoài Phần Khái niệm cơ bản nó nói: "Trong khi các ứng dụng đang ở mặt trước nhiệm vụ nền thắng' t có bất kỳ ảnh hưởng nào ". Điều này có nghĩa là bạn không thể bắt đầu tác vụ nền bằng cách sử dụng NSURLConnection trong khi ở nền trước nếu bạn muốn tải xuống ở nền trước.

+0

Tài liệu này nói rằng " , nếu người dùng di chuyển ứng dụng sang nền, sự tồn tại của tác vụ nền sẽ tự động giữ cho ứng dụng chạy để nó có thể hoàn thành thao tác. " Điều này làm cho cảm giác hoàn hảo đối với tôi như cách nhiệm vụ nền hoạt động - khi bạn khởi động tác vụ (ví dụ: tải xuống tệp) ở nền trước, nếu ứng dụng nhập vào nền, nó sẽ hoàn thành nhiệm vụ tải xuống mà không cắt kết nối mạng . – sbs

Trả lời

38

Bạn chỉ cần gọi beginBackgroundTaskWithExpirationHandler:trong khi ứng dụng của bạn ở chế độ nền trước khi bạn bắt đầu quy trình tải xuống. Lưu ý rằng bạn phải lưu trữ giá trị trả lại trong một ivar/thuộc tính:

@property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskID; 

@synthesize backgroundTaskID; 

... 

NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
self.backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
    // Cancel the connection 
    [connection cancel]; 
}]; 

Điều này sẽ cho phép ứng dụng của bạn tiếp tục chạy nếu nó được gửi tới nền khi tải xuống đang chạy. Sau đó, trong các phương thức ủy nhiệm của bạn cho biết việc hoàn thành việc tải xuống, bạn phải đặt kết hợp là endBackgroundTask::

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    // Handle the error 
    ... 

    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskID]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // Save the downloaded data 
    ... 

    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskID]; 
} 
+0

vừa thử phương pháp này, hoạt động như một nét duyên dáng với NSURLConnection! cảm ơn! – sbs

+0

Lưu ý rằng hiện nay phương pháp này chỉ hoạt động trong 3 phút ở chế độ nền kể từ iOS 7, có cách nào để giữ cho nó hoạt động không? – CGR

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