Trong một trong các ứng dụng của tôi, tôi đã tải lượng dữ liệu khổng lồ. Tôi chắc chắn không thể mong đợi người dùng giữ ứng dụng ở nền trước cho đến khi dữ liệu được tải xuống. Tôi chỉ sử dụng mã sau để tải xuống dữ liệu trong khi ứng dụng ở chế độ nền.làm việc của nó đúng :-)
Hãy đi qua các bước sau:
1) sử dụng dòng sau trong tập tin tiêu đề của ViewController
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;
tổng hợp nó trong file .m.
2) trong viewDidLoad gán UIBackgroundTaskIdentifier như:
self.backgroundTask = UIBackgroundTaskInvalid;
3) Sử dụng dòng mã sau đây, ở đây tôi chỉ giữ trên phương pháp getDataFromServer bên beginBackgroundTaskWithExpirationHandler: block.
self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
}];
/* Here your downloading Code, let say getDataFromServer method */
[self getDataFromServer]; // Its dummy method
/* Your downloading Code End Here */
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
});
4) Nếu bạn muốn kiểm tra thời gian còn lại để tải dữ liệu ở chế độ nền, bao gồm dòng sau trong applicationDidEnterBackground: (UIApplication *) Phương pháp đại biểu áp dụng appdelegate:
NSLog(@"Background time remaining = %.1f seconds", [UIApplication sharedApplication].backgroundTimeRemaining);
Nguồn
2013-09-27 06:37:40
cuối cùng bạn có thể tải xuống tệp đó dưới nền? – Mahesh
Xem câu trả lời của MMR bên dưới. Nền tảng thực sự 'NSURLSession' là cách tốt nhất để đạt được điều này ngày nay. Tất cả các câu trả lời khác được cập nhật trước kỹ thuật này. Nếu bạn có một tải xuống nhỏ cần ít hơn 3 phút để hoàn thành, tác vụ nền là cách tiếp cận tốt, nhưng đối với tải xuống nền lớn, hãy sử dụng nền 'NSURLSession'. – Rob