将视频文件保存到iCloud

时间:2012-08-17 20:47:19

标签: core-data metadata icloud

我目前正在尝试将视频文件保存到iCloud。我正在使用Core Data为每个视频保存文件名字符串(filename.MOV),然后从ubiquity容器中检索它们。它都在本地工作(文件保存,可以从他们的URL访问),但我很难通过iCloud获取视频。核心数据同步,所以我可以访问文件名,但是当我尝试从URL获取视频时,我无法进行。

这是我从UIImagePicker获取其网址(下面的videoURL)并从当前日期创建一个唯一字符串后保存视频的方式:

NSString *videoFileName = [stringFromDate stringByAppendingPathExtension:@"MOV"];

NSURL *ubiquityContainer = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
NSURL *saveToURL = [ubiquityContainer URLByAppendingPathComponent:videoFileName];

BOOL ok;
ok = [[NSFileManager defaultManager] setUbiquitous:YES itemAtURL:videoURL destinationURL:saveToURL error:nil];
if (!ok) NSLog(@"error saving");

然后我有一个核心数据表视图列出所有视频。在这里,我观察核心数据中的变化以与iCloud同步并重新加载(这一切仍然可以正常工作):

- (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(reloadFetchedResults:)
                                             name:@"SomethingChanged"
                                           object:[[UIApplication sharedApplication] delegate]];

}

- (void)reloadFetchedResults:(NSNotification*)note {
    [self performFetch];
}

此时,我希望ubiquity容器能够更新,这样当我选择视频并切换到视图控制器观看时,就可以找到视频文件。 (self.video是我的核心数据视频实体)(资产是视频资产,我可以播放)

NSURL *ubiquityContainer = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
ubiquityContainer = [ubiquityContainer URLByAppendingPathComponent:self.video.url];

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:ubiquityContainer options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]];

AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

这是我遇到麻烦的地方。在我拍摄视频的设备上,但是在另一台设备上,没有找到任何文件(objectAtIndex:0超出界限)。

这是我在视图中调用的元数据查询加载:

NSMetadataQuery * query = [[NSMetadataQuery alloc] init];
NSString * filePattern = [NSString stringWithFormat:@"%@", self.video.url];
[query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@",
                     NSMetadataItemFSNameKey, filePattern]];        
[query startQuery];

我的元数据查询可能有问题,或者可能存在更多问题。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我假设你在iOS上,这意味着在你的第二台设备上没有下载媒体文件(iOS不会下载iCloud文件,直到你真正访问它们,OS X下载所有内容 - 请参阅文档)。

要确保文件在设备上,请使用startDownloadingUbiquitousItemAtURL:error:或coordinateReadingItemAtURL:options:error:byAccessor:如果您想知道它何时完成(在Accessor块中)。无论如何你都需要调用后来进行协调读取,因此第一种方法的用处有限。