2015-04-03 19 views
5

Có cách nào để lưu video trong Bộ nhớ Cache và sau đó thử lại khi cần?Lưu video trong Bộ nhớ Cache

NSCache *memoryCache; //assume there is a memoryCache for images or videos 
NSString *urlString = @"http://blog.jimdo.com/wp-content/uploads/2014/01/tree-247122.jpg"; 
NSString *path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"A"] ofType:@"mov"]; 
NSURL *url = [NSURL fileURLWithPath:path]; 

NSData *downloadedData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^
{ 
    if (downloadedData) 
    { 
     // STORE IN FILESYSTEM 
     NSString* path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; 
     NSString *file = [path stringByAppendingPathComponent:@"B.mov"]; 
     [downloadedData writeToFile:file options:NSDataWritingAtomic error:nil]; 
     NSLog(@"Cache File : %@", file); 

     // STORE IN MEMORY 
     [memoryCache setObject:downloadedData forKey:@"B.mov"]; 
    } 
    // NOW YOU CAN CREATE AN AVASSET OR UIIMAGE FROM THE FILE OR DATA 

}); 

Tôi tìm thấy mã này trên Stack Overflow, nhưng nó dường như không hoạt động.

+0

Op, bạn có câu trả lời? – Pawan

+0

Vẫn còn nhầm lẫn với hành vi của Thư mục Cache –

+0

Có phải nội dung của Danh mục Bộ nhớ cache sẽ bị xóa nếu ứng dụng bị chấm dứt không? –

Trả lời

3

Bạn có thể sử dụng NSURLSessionDownloadTask để tải xuống video hoặc hình ảnh, ghi trực tiếp vào thư mục tạm thời.

Trong download, phiên định kỳ gọi phương thức URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite: của đại biểu với thông tin trạng thái.

Sau khi hoàn thành, phiên sẽ gọi phương thức xử lý hoàn thành hoặc xử lý hoàn thành URLSession:downloadTask:didFinishDownloadingToURL: của đại biểu. Trong phương pháp đó, bạn phải mở tệp để đọc số hoặc di chuyển nó đến vị trí cố định trong thư mục vùng chứa hộp cát của ứng dụng của bạn.

NSURL *URL = [NSURL URLWithString:@"http://blog.jimdo.com/wp-content/uploads/2014/01/tree-247122.jpg"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 

NSURLSession *session = [NSURLSession sharedSession]; 
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request 
                completionHandler: 
^(NSURL *location, NSURLResponse *response, NSError *error) { 
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; 
    NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:documentsPath]; 
    NSURL *documentURL = [documentsDirectoryURL URLByAppendingPathComponent:[response 
    suggestedFilename]]; 
    [[NSFileManager defaultManager] moveItemAtURL:location 
              toURL:documentURL 
              error:nil]; 
    }]; 

    [downloadTask resume]; 

NSURLSessionDownloadTask Class Reference

0

NSCache là như NSDictionary nhưng đổ chính nó nếu nó phát hiện bộ nhớ bị lãng phí. Dưới đây là các tài liệu: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSCache_Class/

Ngay cả các video nhỏ cũng lớn nên có thể ngay lập tức bán nó ra khỏi bộ nhớ hoặc từ chối lưu trữ nó ngay từ đầu.

Bạn có thể lưu trữ video trong một NSDictionary được lưu trữ trong một số loại singleton nhưng điều này dẫn đến vấn đề tiếp theo: Tôi không thể hiểu được bất kỳ lý do gì để lưu trữ video trong bộ nhớ cho thiết bị iOS. Có rất ít bộ nhớ - ít hơn nhiều so với một máy tính để bàn - nhưng tất cả các thiết bị iOS có I/O đĩa đặc biệt nhanh. Đó là, nó rất đắt tiền để cache một video trên một thiết bị iOS và không thêm lợi ích đáng kể.

Vì vậy, bạn có thể tạo một singleton, thêm từ điển và lưu trữ ở đó. Nhưng bạn thực sự không nên: chỉ cần lấy nó từ đĩa khi cần thiết.

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