2016-08-01 81 views
1

我尝试在我的Mac上列出我的所有文件,以查看我制作的应用程序。我使用NSMetadataQuery,但它不起作用。NSMetadataQuery不返回任何数据

下面是代码:

import Cocoa 

class ViewController: NSViewController 
{ 

let metadataQuery = NSMetadataQuery() 

@IBOutlet weak var searchTextField: NSTextField! 

@IBOutlet weak var labelML: NSTextField! 

@IBAction func searchClick(sender: AnyObject) 
{ 
    labelML.stringValue = "Hello \(searchTextField.stringValue)!" 
    startQuery() 
    handleMetadataQueryFinished(metadataQuery) 
} 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 


func startQuery() 
{ 
    print("Starting the query now...") 

    metadataQuery.searchScopes = [NSMetadataQueryUbiquitousDataScope] 
    let predicate = NSPredicate(format: "%K ==[cd] '*'", NSMetadataItemFSNameKey) 

    metadataQuery.predicate = predicate 
    if metadataQuery.startQuery(){ 
     print("Successfully started the query.") 
    } else { 
     print("Failed to start the query.") 
    } 

} 

func handleMetadataQueryFinished(sender: NSMetadataQuery) 
{ 

    print("Search finished"); 
    metadataQuery.disableUpdates() 
    metadataQuery.stopQuery() 
    print("Number of results \(metadataQuery.resultCount)") 

    for item in metadataQuery.results as! [NSMetadataItem] 
    { 

     let itemName = item.valueForAttribute(NSMetadataItemFSNameKey) 
      as! String 

     let itemUrl = item.valueForAttribute(NSMetadataItemURLKey) 
      as! NSURL 

     let itemSize = item.valueForAttribute(NSMetadataItemFSSizeKey) 
      as! Int 
     print("Item name = \(itemName)") 
     print("Item url = \(itemUrl)") 
     print("Item size = \(itemSize)") 

    } 

    } 

} 

正如你所看到的,我打印metaQuery的结果的数量,并回答了0

我试着改变一些东西像NSMetadataQueryIndexedLocalComputerScope代替NSMetadataQueryUbiquitousDataScope或谓词的格式,但无论如何它不工作。

任何想法为什么?

回答

1

您应该为NSMetadataQueryDidFinishGatheringNotification注册一个观察者并等待直到它被调用。搜索需要一段时间。并开始查询返回true

这里是从我的一些代码的Objective-C风格的例子:

#import "CloudUtils.h" 

@interface CloudUtils() 
@property(nonatomic, strong) NSMetadataQuery *query; 
@end 

@implementation CloudUtils 

static CloudUtils *singleton; 

+ (CloudUtils *) sharedInstance 
{ 
    if (singleton == nil) { 
     singleton = [[CloudUtils alloc] init]; 
    } 
    return singleton; 
} 

+ (void) updateCloudDrive 
{ 
    NSLog(@"in updateCloudDrive"); 

    CloudUtils *utils = [CloudUtils sharedInstance]; 

    // Wichtig: Das Query muss STRONG gebunden sein... sonst ist das zu früh wieder weg! 
    utils.query    = [[NSMetadataQuery alloc] init]; 
    utils.query.searchScopes = [NSArray arrayWithObjects:NSMetadataQueryUbiquitousDocumentsScope, NSMetadataQueryUbiquitousDataScope,nil]; 
    utils.query.predicate = [NSPredicate predicateWithFormat:@"%K like[cd] %@", NSMetadataItemFSNameKey, @"*"]; 

    [[NSNotificationCenter defaultCenter] addObserver:utils 
              selector:@selector(queryDidFinishGathering:) 
               name:NSMetadataQueryDidFinishGatheringNotification 
               object:utils.query]; 

    [[NSNotificationCenter defaultCenter] addObserver:utils 
              selector:@selector(queryDidUpdate:) 
               name:NSMetadataQueryDidUpdateNotification 
               object:utils.query]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Das scheitert, falls schon ein solches Query läuft... was aber nicht schlimm ist. 
     [utils.query startQuery]; 
    }); 
} 

// Diese Methode kommt ins Spiel, wenn es zu viele Ergebnisse auf einmal sind... 
// Dann werden einige davon schon gemeldet, bevor das Query ganz fertig ist... 
- (void) queryDidUpdate: (NSNotification *) notification 
{ 
    NSLog(@"in queryDidUpdate:"); 

    NSMetadataQuery *query = [notification object]; 
    [query disableUpdates]; 
    NSError *error = nil; 
    for (NSMetadataItem *item in [query results]) { 
     NSURL *url = [item valueForAttribute:NSMetadataItemURLKey]; 
     NSLog(@"starting download of %@", url); 
     [[NSFileManager defaultManager] startDownloadingUbiquitousItemAtURL:url error:&error]; 
    } 
    [query enableUpdates]; 
} 

- (void) queryDidFinishGathering: (NSNotification *) notification 
{ 
    NSLog(@"in queryDidFinishGathering:"); 

    NSMetadataQuery *query = [notification object]; 
    [query disableUpdates]; 
    [query stopQuery]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSMetadataQueryDidFinishGatheringNotification object:query]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSMetadataQueryDidUpdateNotification   object:query]; 

    NSError *error = nil; 
    for (NSMetadataItem *item in [query results]) { 
     NSURL *url = [item valueForAttribute:NSMetadataItemURLKey]; 
     NSLog(@"starting download of %@", url); 
     [[NSFileManager defaultManager] startDownloadingUbiquitousItemAtURL:url error:&error]; 
    } 
} 

@end