2014-01-13 5 views
0

파일을 다운로드 할 수 있기 때문에 파일이 있다는 것을 알고 있지만 파일이 있는지 여부를 확인해야합니다. 사용해 보았습니다iCloud에서 파일의 존재 여부를 어떻게 확인합니까?

[NSFileManager contentsOfDirectoryAtPath:error:] 

하지만 나에게 알려줍니다. 나는 내가 찾고있는 파일을 여전히 다운로드 할 수 있기 때문에 그 이유가 무엇인지 이해하지 못한다. 어쩌면 그것은 잘못된 URL이지만 내가 사용하고있는 URL은 내가 찾고있는 UIDocument를 만들 때 인쇄 한 URL입니다. 어쩌면 내가 잘못된 방법을 사용하고 있을까요?

편집 :

나는 또한 NSMetadataQuery를 사용하여 시도했고, 나는 그것이 알림을 다시주고받을 수 있지만, 이제까지 내가 명시 적으로 내가 찾고 파일을 다운로드 할 수 있지만 결과가 없습니다.

답변

3

iCloud에서 파일을 찾으려면 NSMetadataQuery을 사용하십시오. 그러면 이미 다운로드 된 파일과 사용자 계정에 있지만 로컬 장치에 아직 다운로드되지 않은 파일을 모두 찾을 수 있습니다. NSFileManager을 사용하면 기껏해야 이미 다운로드 된 파일 만 찾습니다.

는이 같은 뭔가를 설정 :

NSMetadataQuery *query = [[NSMetadataQuery alloc] init]; 
[self setMetadataQuery:query]; 
[query setSearchScopes:@[NSMetadataQueryUbiquitousDataScope]]; 
[query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE '*'", NSMetadataItemFSNameKey]]; 

당신은 NSMetadataQueryDidStartGatheringNotification, NSMetadataQueryDidUpdateNotification, 아마도 NSMetadataQueryDidFinishGatheringNotification을 관찰 할 수 있습니다. 그런 다음 검색어를 시작합니다.

[query startQuery]; 

이 작업을 완료하면 검색어로 iCloud 파일을 검색 할 수 있습니다. 알림 등

+0

고마워요,하지만 그 중 하나는 나를 위해 작동하지 않습니다. 내가이 질문을 한 이유는 NSMetadataQuery를 사용할 수 없기 때문에 내가 찾고있는 파일이 내가 생각하는 장소에 있는지 확인하고자한다. (나는 나의 UIDocument의 fileURL을 기록했다.) – user1654889

+0

'NSMetadatqQuery'는 어떻게 동작하는지 보여줍니다. 제대로 작동하지 않으면 작동하도록 질문을 게시하십시오. 이것이 API이고 올바르게 사용하고 결과는 나타나지 않으면 파일이 없거나 (b) iCloud가 고칠 수없는 방식으로 엉망입니다. –

1

는 파일 크기, 다운로드 상태 등의 정보를 얻을 수 있습니다 NSMetadataItem의 경우, 메타 데이터 쿼리를 사용하여 포함됩니다 - 여기 docs에서 몇 가지 예제 코드

/*! Creates and starts a metadata query for iCloud files 

*/ 
- (void)createFileQuery { 
    [_query stopQuery]; 

     if (_query) { 
      [_query startQuery]; 
     } 
     else { 
      _query = [[NSMetadataQuery alloc] init]; 

      [_query setSearchScopes:[NSArray arrayWithObjects:NSMetadataQueryUbiquitousDocumentsScope, NSMetadataQueryUbiquitousDataScope, nil]]; 
      // NSString * str = [NSString stringWithFormat:@"*.%@",_fileExtension]; 
      NSString *str = @"*"; 
      [_query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@", NSMetadataItemFSNameKey, str]]; 

      NSNotificationCenter* notificationCenter = [NSNotificationCenter defaultCenter]; 
      [notificationCenter addObserver:self selector:@selector(fileListReceived) name:NSMetadataQueryDidFinishGatheringNotification object:_query]; 
      [notificationCenter addObserver:self selector:@selector(fileListReceived) name:NSMetadataQueryDidUpdateNotification object:_query]; 
      [_query startQuery]; 
     } 

} 

/*! Gets called by the metadata query any time files change. We need to be able to flag files that 
we have created so as to not think it has been deleted from iCloud. 

*/ 
- (void)fileListReceived { 
    LOG(@"fileListReceived called."); 

    NSArray* results = [[_query results] sortedArrayUsingComparator:^(NSMetadataItem* firstObject, NSMetadataItem* secondObject) { 
     NSString* firstFileName = [firstObject valueForAttribute:NSMetadataItemFSNameKey]; 
     NSString* secondFileName = [secondObject valueForAttribute:NSMetadataItemFSNameKey]; 
     NSComparisonResult result = [firstFileName.pathExtension compare:secondFileName.pathExtension]; 
     return result == NSOrderedSame ? [firstFileName compare:secondFileName] : result; 
    }]; 

    //FLOG(@" results of query are %@", results); 
    for (NSMetadataItem* result in results) { 
     NSURL* fileURL = [result valueForAttribute:NSMetadataItemURLKey]; 
     NSString* fileName = [result valueForAttribute:NSMetadataItemDisplayNameKey]; 
     NSNumber* percentDownloaded = [result valueForAttribute:NSMetadataUbiquitousItemPercentDownloadedKey]; 
     NSNumber *isDownloaded = nil; 
     NSNumber *isDownloading = nil; 
     NSError *er; 
     [fileURL getResourceValue: &isDownloaded forKey:NSURLUbiquitousItemIsDownloadedKey error:&er]; 
     [fileURL getResourceValue: &isDownloading forKey:NSURLUbiquitousItemIsDownloadingKey error:&er]; 
     FLOG(@" Found file %@", fileName); 
    } 

} 
+0

정확하게 필요한 것. –

1

입니다 :

iOS에서는 필요시 적극적으로 파일을 다운로드하십시오. iCloud의 항목은 아직 로컬 인 이 아니며 iOS에서 자동으로 다운로드하지 않습니다. 해당 메타 데이터 만 이 자동으로 다운로드됩니다. 새로운 iCloud 기반의 문서를 처음 다운로드하려면 앱에주의를 기울여 신중하게 설계해야합니다. 이러한 항목을 명시 적으로 다운로드하면 시스템에서 변경 사항을 iCloud에서 다운로드합니다.

iOS 앱 모델 레이어의 일부로 파일 다운로드 상태를 추적하는 것이 좋습니다. 이 정보를 사용하면 더 나은 사용자 경험을 제공 할 수 있습니다. 에 아직 로컬이 아닌 문서를 열려면 길게 지연된 사용자를 놀라게하지 않도록 디자인 할 수 있습니다. 앱의 메타 데이터 검색어에서 제공하는 각 파일 (또는 파일 패키지) URL에 NSURL 메소드 getResourceValue:forKey:error:을 호출하여 NSURLUbiquitousItemIsDownloadedKey 키의 값을 가져옵니다. 이 다운로드되지 않은 파일을 읽는 경우 파일 다운로드가 완료되거나 ( 다운로드에 실패 할 때까지) 조정 된 읽기 작업이 차단되기 때문에 오랜 시간이 걸릴 수 있습니다.

아직 로컬이 아닌 파일 (또는 파일 패키지)의 경우 사용자가 요청할 때 또는 이전에 다운로드를 시작할 수 있습니다. 앱의 사용자 파일의 수가 많지 않거나 많지 않은 경우 을 고려해야 할 전략 중 하나는 메타 데이터 이 나타내는 모든 파일을 적극적으로 다운로드하는 것입니다. 쿼리에서 제공하는 각 파일 (또는 파일 패키지) URL에 대해 NSFileManager 메서드 startDownloadingUbiquitousItemAtURL:error:을 호출하여 을 해당 항목 로컬로 만듭니다. 이 메서드에 이미 로컬 인 항목에 URL을 전달하면 메서드는 아무 작업도 수행하지 않고 은 YES를 반환합니다.

업데이트 : iOS7은 NSURLUbiquitousItemIsDownloadedKey 대신 NSURLUbiquitousItemDownloadingStatusKey을 사용해야합니다.

관련 문제