在缓存中保存视频

时间:2015-04-03 09:41:27

标签: ios objective-c xcode caching

有没有办法将视频保存在缓存中,然后在需要时检索它?

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

});

我在Stack Overflow上发现了这个代码,但它似乎没有用。

2 个答案:

答案 0 :(得分:4)

您可以使用NSURLSessionDownloadTask下载视频或图片,直接写入临时目录。

  

在下载过程中,会话会定期调用代理人   URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:   具有状态信息的方法。

     

完成后,会话将调用代理URLSession:downloadTask:didFinishDownloadingToURL:   方法或完成处理程序。在该方法中,您必须打开文件   读取或移动到应用程序沙箱容器目录中的永久位置。

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

答案 1 :(得分:0)

NSCache就像NSDictionary,但如果检测到内存浪费,它就会自行清空。以下是文档:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSCache_Class/

即使很小的视频也很大,因此可能会立即将其从内存中丢弃或拒绝将其存储在首位。

您可以将视频存储在存储在某种类型的单例中的NSDictionary中,但这会导致下一个问题:我无法理解将内容存储在iOS设备的内存中的任何理由。内存很少 - 远远低于台式计算机 - 但所有iOS设备都具有异常快速的磁盘I / O.也就是说,在iOS设备上缓存视频是非常昂贵的,并且没有增加任何可辨别的好处。

因此,您可以创建单例,添加字典并将其存储在那里。但你真的不应该:只需要在磁盘上检索它。