Core data 将视频文件保存到iCloud

Core data 将视频文件保存到iCloud,core-data,metadata,icloud,Core Data,Metadata,Icloud,我目前正在尝试将视频文件保存到iCloud。我使用核心数据为每个视频保存文件名字符串(filename.MOV),然后从ubiquity容器中检索它们。这一切都可以在本地运行(保存文件,并可以从URL访问),但我很难通过iCloud获得视频。核心数据同步,因此我可以访问文件名,但当我试图从URL获取视频时,我无法访问 这是我从UIImagePicker获取视频的url(下面的videoURL)并从当前日期创建唯一字符串后保存视频的方式: NSString *videoFileName = [st

我目前正在尝试将视频文件保存到iCloud。我使用核心数据为每个视频保存文件名字符串(filename.MOV),然后从ubiquity容器中检索它们。这一切都可以在本地运行(保存文件,并可以从URL访问),但我很难通过iCloud获得视频。核心数据同步,因此我可以访问文件名,但当我试图从URL获取视频时,我无法访问

这是我从UIImagePicker获取视频的url(下面的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同步并重新加载(这一切仍然可以正常工作):

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

这就是我遇到麻烦的地方。在我拍摄视频的设备上,它可以正常工作,但在另一台设备上,找不到任何文件(objectAtIndex:0超出边界)

这是我在查看加载时调用的元数据查询:

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

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

我假设您使用的是iOS,这意味着在您的第二台设备上尚未下载媒体文件(iOS在您实际访问iCloud文件之前不会下载iCloud文件,OS X会下载所有内容-请参阅文档)

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

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];
NSMetadataQuery * query = [[NSMetadataQuery alloc] init];
NSString * filePattern = [NSString stringWithFormat:@"%@", self.video.url];
[query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@",
                     NSMetadataItemFSNameKey, filePattern]];        
[query startQuery];