1

我目前正在尝试将视频文件保存到 iCloud。我正在使用 Core Data 为每个视频保存文件名字符串 (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 同步并重新加载的变化(这一切仍然正常):

- (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];

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

4

1 回答 1

0

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

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

于 2012-08-31T20:50:16.903 回答