2013-02-19 51 views
5

Tôi đang cố gắng sử dụng FSEvents trong ứng dụng hộp cát của tôi để giám sát một số thư mục. Tôi thực hiện các lớp sau:Sử dụng FSEvents trong ứng dụng hộp cát

@implementation SNTracker 

- (id)initWithPaths:(NSArray *)paths { 
    self=[super init]; 
    if (self) { 
     trackedPaths=paths; 
     CFTimeInterval latency=1.0; 
     FSEventStreamContext context={0,(__bridge void *)self,NULL,NULL,NULL}; 
     FSEventStreamRef eeventStream=FSEventStreamCreate(kCFAllocatorDefault,&callback,&context,(__bridge CFArrayRef)trackedPaths,kFSEventStreamEventIdSinceNow,latency,kFSEventStreamCreateFlagUseCFTypes|kFSEventStreamCreateFlagWatchRoot|kFSEventStreamCreateFlagFileEvents); 
     FSEventStreamScheduleWithRunLoop(eeventStream,[[NSRunLoop mainRunLoop] getCFRunLoop],kCFRunLoopDefaultMode); 
     FSEventStreamStart(eeventStream); 
    } 
    return self; 
} 

static void callback(ConstFSEventStreamRef streamRef,void *clientCallBackInfo,size_t numEvents,void *eventPaths,const FSEventStreamEventFlags eventFlags[],const FSEventStreamEventId eventIds[]) { 
    NSLog(@"asd"); 
} 

Vấn đề là "asd" không bao giờ được in (ví dụ: chức năng gọi lại không bao giờ được gọi là). Khi tôi tắt "Bật ứng dụng Sandboxing" trong Tóm tắt mục tiêu chính của tôi trong Xcode, cuộc gọi lại được gọi. Tôi có làm điều gì sai? Quyền lợi duy nhất mà tôi đã cung cấp cho ứng dụng hộp cát là truy cập đọc-ghi đối với các tệp do người dùng chọn.

+1

Và người dùng đã chọn đường dẫn bạn đang cố gắng giám sát qua FSEvent? Vì nếu anh ta không có, bạn sẽ không được phép truy cập nó và do đó cũng không theo dõi nó. – Mecki

+0

Bạn là sự cứu rỗi của tôi! Tôi đã gọi '[myURL startAccessingSecurityScopedResource]' nhưng cũng '[myURL stopAccessingSecurityScopedResource]', vì vậy việc xóa cuộc gọi cuối cùng sẽ giải quyết được vấn đề của tôi. Xin vui lòng thêm bình luận của bạn như là một câu trả lời, vì vậy tôi có thể đánh dấu nó như được giải quyết :-) – Nickkk

+0

@Nickkk: Bạn có lẽ vẫn nên gọi đó cuối cùng, chỉ cần không đúng sau khi bạn bắt đầu theo dõi. 'dealloc' có lẽ là một nơi tốt. –

Trả lời

2

Và người dùng đã chọn đường dẫn bạn đang cố gắng giám sát qua FSEvent? Vì nếu anh ta không có, bạn sẽ không được phép truy cập nó và do đó cũng không theo dõi nó. Một con đường chỉ có thể được theo dõi miễn là bạn được phép truy cập nó.