Tôi đang làm việc trên một tác vụ (chỉ iOS5 +) liên quan đến việc tải xuống hàng nghìn hình ảnh từ máy chủ. Các hình ảnh thuộc về các danh mục nhất định và mỗi danh mục có thể có hàng trăm hình ảnh. Những gì tôi cần làm là: -AFNetworking + NsOperationQueue - Tải xuống hàng nghìn Hình ảnh
1) Đảm bảo ứng dụng tải xuống bất kỳ hình ảnh nào bị thiếu trong nền nếu ứng dụng đang hoạt động (ngay cả khi người dùng đang duyệt một số khu vực khác của ứng dụng không liên quan đến ảnh) .
2) Khi người dùng nhấp vào Danh mục ảnh, hình ảnh trong Danh mục đó phải được tải xuống là ưu tiên cao vì đó là những hình ảnh cần được hiển thị ngay lập tức.
Tất cả những điều trên chỉ xảy ra nếu hình ảnh không khả dụng ngoại tuyến. Sau khi tải xuống, hình ảnh sẽ được sử dụng từ bộ nhớ cục bộ.
Để giải quyết việc này, logic Tôi đang sử dụng là: -
1) Trong AppDelegate.m, trong applicationDidBecomeActive
, tôi bắt đầu downlading bất kỳ hình ảnh thiếu. Để thực hiện điều này, tôi thực hiện truy vấn Dữ liệu cốt lõi, tìm hiểu hình ảnh nào bị thiếu và bắt đầu tải xuống chúng trong chuỗi có mức độ ưu tiên BACKGROUND. Một cái gì đó như thế này: -
dispatch_queue_t imageDownloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_async(imageDownloadQueue, ^{
[DataDownloader downloadMissingImages];
});
dispatch_release(imageDownloadQueue);
Các downloadMissingImages
mã trông như thế này: -
NSOperationQueue *downloadQueue = [[NSOperationQueue alloc] init];
downloadQueue.maxConcurrentOperationCount = 20;
for(MyImage *img in matches)
{
NSURLRequest *request = [NSURLRequest requestWithURL:img.photoUrl];
AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request success:^(UIImage *image) {
[MyImage imageFromAPI:image inManagedObjectContext:document.managedObjectContext];
NSLog(@"Successfully downloaded image for %@", img.title);
}];
[downloadQueue addOperation:operation];
}
này hoạt động, nhưng nó ngăn chặn các giao diện người dùng chính và treo ứng dụng sau một thời gian. Đây là khi tôi cố tải xuống khoảng 700 hình ảnh. Với nhiều hình ảnh hơn, nó chắc chắn sẽ sụp đổ.
2) Khi người dùng nhấp vào danh mục, trước tiên tôi cần phải tải xuống những hình ảnh đó vì chúng phải được hiển thị cho người dùng ngay lập tức. Tôi không chắc chắn làm thế nào tôi có thể gián đoạn cuộc gọi missingImages và nói với nó để bắt đầu tải về hình ảnh nhất định trước khi những người khác. Vì vậy, về cơ bản, tôi cần phải tải xuống tất cả các hình ảnh bị thiếu trong nền nhưng nếu người dùng đang duyệt danh mục ảnh, những hình ảnh đó phải có mức độ ưu tiên cao trong hàng đợi tải xuống.
Tôi đang mất mát cách làm việc này hiệu quả. Có suy nghĩ gì không?
bản ghiVụ tai nạn giống như thế này
PAPP(36373,0xb065f000) malloc: *** mmap(size=16777216) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
PAPP(36373,0xb065f000) malloc: *** mmap(size=16777216) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Jun 24 11:39:45 MacBook-Pro.local PAPP[36373] <Error>: ImageIO: JPEG Insufficient memory (case 4)
Cảm ơn trước.
Hi Sergio, có bạn có bất kỳ mẫu mã để chứng minh tải chunked như bạn đề nghị? –
Cũng , làm thế nào để kiểm tra xem một hàng đợi ưu tiên cao hơn đã tải xuống một ce có được hình ảnh? Bất kỳ mã mẫu nào cho điều đó? –
Đã sửa đổi câu hỏi để bao gồm nhật ký sự cố - Tôi tạo hình thu nhỏ từ mỗi hình ảnh tải xuống .. vì vậy tôi đoán 700 hình ảnh chắc chắn gây ra rò rỉ bộ nhớ ở đây .. –