2012-06-19 33 views
13

Tôi đang tạo một ứng dụng trong đó tôi đang tải xuống một số dữ liệu từ máy chủ. Trong khi đang ở chế độ nền, tôi muốn kết nối đó sẽ tiếp tục chạy để dữ liệu có thể được tải xuống. Tôi biết có phương pháp trong appdelegateTiếp tục tải xuống ở chế độ nền

- (void)applicationDidEnterBackground:(UIApplication *)application 

mà được gọi khi ứng dụng vào nền. Nhưng khi kết nối được tạo ra trong viewController, làm thế nào nó có thể được quản lý trong appDelegate?
Cũng có/có cách nào khác có thể thực hiện được không? Tôi đã đi qua liên kết this nhưng có một cái gì đó đơn giản để thực hiện?

+0

đó là cách chính thức để làm điều đó, thre Không có cách khác càng nhiều như tôi biết –

+0

bạn nên kiểm tra liên kết này http://stackoverflow.com/questions/4579810/ios-application-background-downloading – swiftBoy

Trả lời

14

Một cách để thực hiện một số thao tác tiếp tục trong nền là tạo một chuỗi riêng để thực hiện tải xuống. Bên trong chuỗi, gắn kết hoạt động tải xuống của bạn giữa các cuộc gọi để bắt đầuBackgroundTaskWithExpirationHandler: và kết thúcBackgroundTask. Bạn không cần phải kiểm tra xem bạn đang chạy trong nền hay không, bạn chỉ cần luôn gọi hai phương thức này.

// Tell iOS this as a background task in case we get backgrounded 
UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] 
      beginBackgroundTaskWithExpirationHandler:NULL]; 

//---------------------------------------------- 
// Perform your download operations here 
//---------------------------------------------- 
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 

// Tell iOS that we are done with stuff that needed to keep going even if backgrounded  
[[UIApplication sharedApplication] endBackgroundTask:taskId]; 
+1

Bạn có thể đặt thuộc tính ASIHttpRequest: [request setShouldContinueWhenAppEntersBackground: YES]; – HelloWorld

+0

Cảm ơn bạn rất nhiều !!! Vui lòng sửa tôi nếu tôi sai: Để kết luận, hầu như không có sự khác biệt giữa chạy tác vụ ở nền hoặc nền trước. Cả hai sẽ thực thi với mã này. Tuy nhiên, 2 sự khác biệt đến với tâm trí: 1.** nếu ** tác vụ nền của bạn quá dài, có thể bạn sẽ bị chấm dứt trước khi hoàn thành nó! 2. Tốt hơn là 'endBackgroundTask: taskId' để bạn tiết kiệm pin phụ. – Honey

4

[edit] Xin lỗi tôi đã sai, như đã được chỉ ra trong phần bình luận bạn có thể kéo dài thời gian bạn phải thực hiện thao tác một lần/trước khi ứng dụng của bạn chạy ngầm. Đây là Apple's Official Documentation

+0

Điều này không đúng, bạn có thể thực hiện [nhiệm vụ hữu hạn-chiều dài] (http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/ doc/uid/TP40007072-CH4-SW28) trong nền tối đa 10 phút. – rckoenes

+0

@rckoenes bạn thực sự là chính xác, xin lỗi của tôi. Tôi sẽ chỉnh sửa câu trả lời của mình. Cảm ơn thông tin :) – bennythemink

+0

Vẫn không đúng, bạn có thể gọi ['beginBackgroundTaskWithExpirationHandler:'] (http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html# // apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithExpirationHandler :) trước khi thực hiện tác vụ Độ dài hữu hạn. Bạn không cần phải thực hiện các thao tác khi bạn chạy ẩn. Bạn có thể bắt đầu tác vụ trước khi ứng dụng của bạn bị đẩy lên nền. – rckoenes

1

Tôi không biết cách bạn xử lý dữ liệu của mình tải xuống chính xác. Nhưng bạn có thể xem ASIHTTPRequest. Nó rất đơn giản và dễ hiểu, và làm việc với ARC nếu bạn đặt cờ biên dịch thành -fno-objc-arc. Với điều này, bạn chỉ phải sử dụng

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request setShouldContinueWhenAppEntersBackground:YES]; //For iOS 4.0 and up 

Và nó hoạt động.

Here bạn có thể thấy cách làm việc ASIHTTPRequest

Hy vọng nó sẽ giúp!

+0

ASIHTTPRequest không được phát triển tích cực nữa ... theo thông báo [tại đây] (http://allseeing-i.com/ASIHTTPRequest/). Chỉ cần nói. – zero0cool

+0

Đúng, nhưng nó vẫn hoạt động như một sự quyến rũ. Tôi đã không tìm thấy bất kỳ lựa chọn thay thế tốt với nhiều chức năng như ASIHTTPRequest. – Thermometer

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