2014-01-30 3 views
1

Я хочу отслеживать процент моего загруженного файла в icloud с помощью NSMetadataQuery, но это не сработало.не может вызвать NSMetadataQueryDidUpdateNotification

Это мой код:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { 
    NSFileCoordinator* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil]; 
    [fileCoordinator coordinateReadingItemAtURL:backupUrl options:NSFileCoordinatorReadingWithoutChanges error:nil byAccessor:^(NSURL *newURL) { 
     NSFileManager* fm = [NSFileManager defaultManager]; 
     NSError *theError = nil; 

     BOOL success =[fm setUbiquitous:YES itemAtURL:backupUrl destinationURL:[[ubiq URLByAppendingPathComponent:@"Documents" isDirectory:true] URLByAppendingPathComponent:bName] error:&theError]; 

     if (!(success)) { 
      [progView dismiss]; 
      UIAlertView* alertFail=[[UIAlertView alloc]initWithTitle:@"Backup Error" message:@"Could not backup to iCloud." delegate:Nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
      [alertFail show]; 
      NSLog(@"iCloud error: %@", [theError localizedDescription]); 
     } 
     else{ 
      NSURL* destURL=[[ubiq URLByAppendingPathComponent:@"Documents" isDirectory:true] URLByAppendingPathComponent:bName]; 
      NSMetadataQuery* query=[[NSMetadataQuery alloc]init]; 
      [query setPredicate:[NSPredicate predicateWithFormat:@"%K > 0",NSMetadataUbiquitousItemPercentUploadedKey]]; 
      [query setSearchScopes:@[destURL]]; 
      [query setValueListAttributes:@[NSMetadataUbiquitousItemPercentUploadedKey,NSMetadataUbiquitousItemIsUploadedKey]]; 

      _alertQuery=query; 
      [query enableUpdates]; 
      [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(liveupdate:) name:NSMetadataQueryDidUpdateNotification object:query]; 
`//    [progView dismiss]; 
      NSLog(@"desturl %@",query); 
      [query startQuery]; 
     } 
    }]; 

-(void)liveupdate:(NSNotification *)note{ 
NSMetadataQuery* query=[note object]; 
if ([query resultCount]==0) 
    return; 

NSMetadataItem* item=[query resultAtIndex:0]; 
float progress=[[item valueForAttribute:NSMetadataUbiquitousItemPercentUploadedKey]floatValue]; 

[progView.progBar setProgress:progress animated:NO]; 

if ([[item valueForAttribute:NSMetadataUbiquitousItemIsUploadedKey] boolValue]){ 
    [query stopQuery]; 
    [query disableUpdates]; 
    _alertQuery=nil; 
    [progView dismiss]; 
} 

}

метод liveUpdate:note не назвал. может кто-нибудь помочь мне, как исправить этот код. спасибо

я отредактировал мой код ...

это мой новый код

- (void)loadNotes:(NSString *)bname { 
self.alertQuery = [[NSMetadataQuery alloc] init]; 
[self.alertQuery setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@", NSMetadataItemFSNameKey, bname]]; 
[self.alertQuery setSearchScopes:@[NSMetadataQueryUbiquitousDataScope]]; 
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(liveupdate:) name:NSMetadataQueryDidUpdateNotification object:self.alertQuery]; 
[self.alertQuery startQuery]; 
} 
-(void)liveupdate:(NSNotification *)note { 
    NSMetadataQuery* query=[note object]; 
    if ([query resultCount]==0){ 
     return; 
    } 
    NSMetadataItem* item=[query resultAtIndex:0]; 
    float progress=[[item valueForAttribute:NSMetadataUbiquitousItemPercentUploadedKey]floatValue]; 


[progView.progBar setProgress:progress animated:NO]; 

if ([[item valueForAttribute:NSMetadataUbiquitousItemIsUploadedKey] boolValue]){ 
    [query stopQuery]; 
    [query disableUpdates]; 
    _alertQuery=nil; 
    [progView dismiss]; 
} 
} 

она до сих пор не может вызвать метод LiveUpdate. В чем проблема с моим кодом?

ответ

2

Похоже, что у вас есть некоторые проблемы с запросом метаданных. Первый:

[query setPredicate:[NSPredicate predicateWithFormat:@"%K > 0",NSMetadataUbiquitousItemPercentUploadedKey]]; 

Возможно, это должно работать, но я довольно скептически отношусь к этому. Здесь вам действительно нужен предикат, который использует имя файла. Если имя файла сохраняется в NSString имени filename, что-то вроде этого:

[query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@", NSMetadataItemFSNameKey, filename]]; 

Это самая большая проблема. Исправить это может быть все, что вам нужно. Но есть и другие вещи, которые я бы изменил. Далее:

[query setSearchScopes:@[destURL]]; 

Опять же, это может быть что-то, что должно работать, но я только видел хорошие результаты с гораздо более общей ситуации:

[query setSearchScopes:@[NSMetadataQueryUbiquitousDataScope]]; 

Наконец:

[query setValueListAttributes:@[NSMetadataUbiquitousItemPercentUploadedKey,NSMetadataUbiquitousItemIsUploadedKey]]; 

Это, вероятно, работает , если вы посмотрели значения непосредственно на объект запроса через valueListAttributes. Но я бы рекомендовал просто полностью отбросить эту строку. Вы все равно можете посмотреть прогресс и статус от NSMetadataItem без него.

+0

Я обновил свой код, но он по-прежнему не может вызвать метод liveupdate. – Faiz

Смежные вопросы