Tôi đang cố gắng tạo lớp sẽ xử lý nhiều lượt tải xuống cùng một lúc (tôi cần tải xuống nhiều tệp nhỏ) và tôi gặp sự cố với kết nối "biến mất".tải xuống nền đồng thời trên iphone
Tôi có chức năng addDonwload để thêm url vào danh sách các url cần tải xuống và kiểm tra xem có sẵn nơi tải xuống miễn phí hay không. Nếu có nó bắt đầu tải xuống ngay lập tức. Khi một trong các tải xuống hoàn tất, tôi chọn danh sách biểu mẫu url đầu tiên và bắt đầu tải xuống mới.
tôi sử dụng NSURLConnection để tải về, đây là một số mã
- (bool) TryDownload:(downloadInfo*)info
{
int index;
@synchronized(_asyncConnection)
{
index = [_asyncConnection indexOfObject:nullObject];
if(index != NSNotFound)
{
NSLog(@"downloading %@ at index %i", info.url, index);
activeInfo[index] = info;
NSURLRequest *request = [NSURLRequest requestWithURL:info.url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];
[_asyncConnection replaceObjectAtIndex:index withObject:[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:TRUE]];
//[[_asyncConnection objectAtIndex:i] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
return true;
}
}
return false;
}
- (void)connectionDidFinishLoading:(NSURLConnection*)connection
{
[self performSelectorOnMainThread:@selector(DownloadFinished:) withObject:connection waitUntilDone:false];
}
- (void)DownloadFinished:(id)connection
{
NSInteger index = NSNotFound;
@synchronized(_asyncConnection)
{
index = [_asyncConnection indexOfObject:(NSURLConnection*)connection];
}
[(id)activeInfo[index].delegate performSelectorInBackground:@selector(backgroundDownloadSucceededWithData:) withObject:_data[index]];
[_data[index] release];
[activeInfo[index].delegate release];
@synchronized(_asyncConnection)
{
[[_asyncConnection objectAtIndex:index] release];
[_asyncConnection replaceObjectAtIndex:index withObject:nullObject];
}
@synchronized(downloadQueue)
{
[downloadQueue removeObject:activeInfo[index]];
[self NextDownload];
}
}
- (void)NextDownload
{
NSLog(@"files remaining: %i", downloadQueue.count);
if(downloadQueue.count > 0)
{
if([self TryDownload:[downloadQueue objectAtIndex:0]])
{
[downloadQueue removeObjectAtIndex:0];
}
}
}
_asyncConnection là mảng của tôi về khe tải (NSURLConnections) downloadQueue là danh sách các url tải
gì xảy ra được, ngay từ đầu mọi thứ hoạt động tốt, nhưng sau khi tải xuống một vài kết nối của tôi bắt đầu biến mất. Quá trình tải xuống bắt đầu nhưng kết nối: didReceiveResponse: không bao giờ được gọi. Có một điều trong giao diện điều khiển đầu ra mà tôi không hiểu tôi có thể giúp một chút. Normaly có một cái gì đó như 2010-01-24 21: 44: 17.504 appName [3057: 207] trước thông điệp NSLog của tôi. Tôi đoán rằng số trong dấu ngoặc vuông là một số loại ứng dụng: id chủ đề? tất cả mọi thứ hoạt động ok trong khi có cùng một số, nhưng sau một thời gian, "NSLog (@" tải xuống% @ tại chỉ mục% i ", info.url, index);" tin nhắn bắt đầu có số thứ hai khác nhau. Và khi điều đó xảy ra, tôi sẽ ngừng nhận bất kỳ cuộc gọi lại nào cho việc kết nối url đó.
Điều này đã khiến tôi phát điên vì tôi có thời hạn nghiêm ngặt và tôi không thể tìm thấy sự cố. Tôi không có nhiều kinh nghiệm với iphone dev và các ứng dụng đa luồng. Tôi đã thử các cách tiếp cận khác nhau nên mã của tôi khá lộn xộn, nhưng tôi hy vọng bạn sẽ thấy những gì tôi đang cố gắng làm ở đây :)
btw là bất kỳ ai trong các bạn biết về lớp/lib hiện có mà tôi có thể sử dụng cũng. Tôi muốn tải xuống song song với khả năng o tự động thêm tệp mới để tải xuống (do đó, khởi chạy trình tải xuống ngay từ đầu với tất cả các url không hữu ích cho tôi)
cảm ơn lời khuyên của bạn. Tôi hoàn toàn viết lại lớp của mình và nó hoạt động như mong đợi. Xin lỗi vì sự chậm trễ nhưng tôi hoàn toàn quên rằng điều này đã được giải quyết từ lâu rồi :) – Lope