-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathSSYFileFinder.m
84 lines (70 loc) · 2.93 KB
/
SSYFileFinder.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#import "SSYFileFinder.h"
@implementation SSYFileFinder
@synthesize callbackTarget ;
@synthesize query ;
- (id)initWithPredicate:(NSPredicate*)predicate
callbackTarget:(id)callbackTarget_
callbackSelector:(SEL)callbackSelector_ {
if (self = [super init]) {
self.query = [[[NSMetadataQuery alloc] init] autorelease] ;
self.callbackTarget = callbackTarget_ ;
callbackSelector = callbackSelector_ ;
// To watch results send by the query, add an observer to the NSNotificationCenter
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(queryNotification:)
name:nil
object:self.query] ;
// We want the items in the query to automatically be sorted by the file system name.
// This way, we don't have to do any special sorting
[self.query setSortDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:(id)kMDItemFSName
ascending:YES] autorelease]]] ;
// So that we'll get that callback
[self.query setDelegate:self] ;
// Set predicate to query and start searching
[self.query setPredicate:predicate] ;
[self.query startQuery] ;
}
return self ;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[query release] ;
[callbackTarget release] ;
[super dealloc];
}
- (void)queryNotification:(NSNotification *)notification {
if ([[notification name] isEqualToString:NSMetadataQueryDidFinishGatheringNotification]) {
NSArray* results = [[notification object] results] ;
NSMutableArray* paths = [NSMutableArray array] ;
for (NSMetadataItem* item in results) {
[paths addObject:[item valueForAttribute:(id)kMDItemPath]] ;
}
[[self callbackTarget] performSelector:callbackSelector
withObject:[NSArray arrayWithArray:paths]] ;
// Now, self-destruct
[self release] ;
}
}
+ (void)findPathsWithPredicate:(NSPredicate*)predicate
callbackTarget:(id)callbackTarget
callbackSelector:(SEL)callbackSelector {
[[SSYFileFinder alloc] initWithPredicate:predicate
callbackTarget:callbackTarget
callbackSelector:callbackSelector] ;
// This instance will release itself, in -queryNotification, when the
// NSMetadataQueryDidFinishGatheringNotification notification is received.
}
+ (void)findPathsWithFilename:(NSString*)filename
callbackTarget:(id)callbackTarget
callbackSelector:(SEL)callbackSelector {
NSPredicate* predicate = [NSComparisonPredicate
predicateWithLeftExpression:[NSExpression expressionForKeyPath:(NSString*)kMDItemDisplayName]
rightExpression:[NSExpression expressionForConstantValue:filename]
modifier:NSDirectPredicateModifier
type:NSEqualToPredicateOperatorType
options:0] ;
[self findPathsWithPredicate:predicate
callbackTarget:callbackTarget
callbackSelector:callbackSelector] ;
}
@end