1

現在、ビデオファイルをiCloudに保存しようとしています。Core Data を使用して各ビデオのファイル名文字列 (filename.MOV) を保存し、それらをユビキタス コンテナーから取得しています。すべてローカルで動作します (ファイルは保存され、URL からアクセスできます) が、iCloud 経由でビデオを取得するのに苦労しています。Core Data は同期するので、ファイル名にアクセスできますが、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");

次に、Core Data テーブル ビューを使用して、すべてのビデオを一覧表示します。ここで、iCloud と同期してリロードするコア データの変更を観察します (これはすべて正常に動作します)。

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

}

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

この時点で、ユビキタス コンテナーを更新して、ビデオを選択し、View Controller にセグエしてそれを見ると、ビデオ ファイルが見つかるようにします。(self.video は私の Core Data ビデオ エンティティです) (asset は再生できるビデオ アセットです)

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

つまり、2 番目のデバイスではメディア ファイルがダウンロードされていません (iOS は、実際にアクセスするまで iCloud ファイルをダウンロードしません。OS X はすべてをダウンロードします。ドキュメントを参照してください)。

ファイルがデバイス上にあることを確認するには、 startDownloadingUbiquitousItemAtURL:error: を使用するか、それがいつ完了したかを知りたい場合は、(Accessor ブロック内で) coordinateReadingItemAtURL:options:error:byAccessor: を使用します。調整された読み取りを行うには、とにかく後で呼び出す必要があるため、最初のメソッドの有用性は限られています。

于 2012-08-31T20:50:16.903 に答える