Xin chào! Tôi cần phải biết làm thế nào tôi có thể có ứng dụng iOS của tôi bắt đầu tải xuống trong nền của ứng dụng (như, có tải xuống chạy trong tệp AppDelegate) vì vậy việc thay đổi ViewControllers sẽ không làm gián đoạn hoặc hủy tải xuống. Tôi cũng cần có thể có được tiến trình tải xuống (0.00000 - 1.00000
), để đặt đối tượng UIProgressView
thành, điều này cũng có nghĩa là tôi cần chức năng - (void)progressDidChangeTo:(int)progress
.Nền ứng dụng iOS Tải xuống
Trả lời
Chỉ cần sử dụng ASIHTTPRequest nó là cách dễ dàng hơn so với NSURLRequest và thực hiện chính xác những gì bạn cần. Nó examples cho biết cách tải xuống dưới nền và cách báo cáo tiến độ.
Tôi sẽ không tải xuống bất kỳ nội dung nào trong AppDelegate trực tiếp. Thay vào đó tôi sẽ tạo ra một lớp riêng biệt chỉ cho mục đích đó. Hãy gọi nó là MyService
Tôi sẽ khởi tạo lớp đó trong ủy nhiệm ứng dụng của mình.
Lớp học có thể hoạt động như một singleton hoặc có thể được chuyển đến từng bộ điều khiển chế độ xem yêu cầu.
Trong lớp MyService
tôi sẽ thêm ASINetworkQueue và một vài phương thức để xử lý các yêu cầu khi chúng sẵn sàng. Đây là mã từ ví dụ ASI mà bạn có thể sử dụng:
- (IBAction)startBackgroundDownloading:(id)sender
{
if (!self.queue) {
self.queue = [[[ASINetworkQueue alloc] init] autorelease];
}
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
[self.queue addOperation:request]; //queue is an NSOperationQueue
[self.queue go];
}
- (void)requestDone:(ASIHTTPRequest *)request
{
NSString *response = [request responseString];
//Do something useful with the content of that request.
}
- (void)requestWentWrong:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}
Nếu bạn cần đặt thanh tiến trình. Tôi chỉ phơi bày setDownloadProgressDelegate của ASINetworkQueue trong lớp MyService của tôi và đặt nó trong ViewControllers của tôi như sau:
[[MyService service] setDownloadProgressDelegate: self.myUIProgressView];
BTW. Nếu bạn cần tiếp tục tải xuống ngay cả khi ứng dụng của bạn thoát, bạn có thể đặt ShouldContinueWhenAppEntersBackground
thuộc tính yêu cầu của bạn thành CÓ.
bạn có thể sử dụng NSURLConnection để bắt đầu yêu cầu không đồng bộ sẽ không làm cho giao diện người dùng của bạn bị đóng băng. Bạn có thể làm điều đó bằng cách làm một cái gì đó như:
NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url];
connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
[urlRequest release];
để có sự tiến bộ của bạn, bạn có thể sử dụng:
connection:didReceiveResponse:(NSURLResponse *)response;
gọi đại biểu để kiểm tra việc response.expectedContentLength và sau đó sử dụng
connection:didReceiveData:(NSData *)data
để theo dõi lượng dữ liệu đã được tải xuống và tính phần trăm.
Hope this helps, Moszi
Tôi có phần tải xuống, sử dụng ASIHTTPRequest, tôi chỉ cần biết cách triển khai tải xuống để bắt đầu trong nền, thay vì UIViewController mở hiện tại, vì vậy khi trình điều khiển chế độ xem bị loại bỏ, quá trình tải xuống tiếp tục. –
Bạn có thể tạo một lớp đơn để quản lý tải xuống của bạn, theo cách này lớp này sẽ được xung quanh ngay cả khi bộ điều khiển xem của bạn là dealloc-ed. (mẫu đơn trên wikipedia: http://en.wikipedia.org/wiki/Singleton_pattern) – Moszi
... Tôi. Tôi cần tải xuống xảy ra trong tệp AppDelegate, do đó quá trình tải xuống sẽ không dừng khi UIViewController khởi động nó. Tôi cần phải biết làm thế nào tôi có thể nhận được một UIViewController để bắt đầu và truy cập vào đối tượng ASIHTTPRequest, nhưng có đối tượng được tổ chức trong AppDelegate. –
@hankweb, tôi vừa cập nhật câu trả lời của mình. –
Vấn đề là reportFailure sẽ được gọi trong ASIHTTPRequest.m mỗi khi ứng dụng của tôi quay trở lại từ nền. Tôi đang sử dụng cùng một cách như bạn đã đề xuất trong bài đăng của bạn và ShouldContineWhenAppEntersBackground được đặt thành CÓ. –