Работа с опциями в FSEventStreamRef API от Swift - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь просмотреть папку, чтобы увидеть, создан ли файл / изменен / удален и т. Д. В этой папке в Mac OS.Я прочитал, что я хочу использовать События файловой системы, но я не могу заставить мой код работать.

Я попытался прочитать документы на apple и прочитатьна разных постах на stackoverflow, но ничего, что я нашел, похоже не работает на swift 4 и xcode 10.

    init(path: String) {
        let allocator: CFAllocator? = kCFAllocatorDefault

        // Create FSEventStream and return valid FSEventStreamRef
        // Alias FSEventStreamCallback - CFunction

        typealias FSEventStreamCallback = @convention(c) (ConstFSEventStreamRef, UnsafeMutableRawPointer?, Int, UnsafeMutableRawPointer, UnsafePointer<FSEventStreamEventFlags>, UnsafePointer<FSEventStreamEventId>) -> Void


        let callback: FSEventStreamCallback = {
            (streamRef, clientCallBackInfo, numEvents, eventPaths, eventFlags, eventIds) -> Void in
            print ("changed")
            // handle file event
        }

        let context: UnsafeMutablePointer<FSEventStreamContext>? = nil
        let pathsToWatch: CFArray = [NSHomeDirectory() + path] as CFArray
        let sinceWhen: FSEventStreamEventId = UInt64(kFSEventStreamEventIdSinceNow)
        let latency: CFTimeInterval = 1.0
        let flags: FSEventStreamCreateFlags = UInt32(kFSEventStreamCreateFlagNone)
        let eventStream = FSEventStreamCreate(
            allocator,
            callback,
            context,
            pathsToWatch,
            sinceWhen,
            latency,
            flags
        )

        FSEventStreamScheduleWithRunLoop(eventStream, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode as! CFString)
        FSEventStreamStart(eventStream!)
    }

Я либо получаю ошибку

Value of optional type 'FSEventStreamRef?' (aka 'Optional<OpaquePointer>') must be unwrapped to a value of type 'FSEventStreamRef' (aka 'OpaquePointer')

, когда пытаюсьпостроить или

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

во время выполнения, если я добавлю '!'to "eventStream"

Что мне нужно изменить, чтобы запустить его?

1 Ответ

0 голосов
/ 18 февраля 2019

eventStream необходимо развернуть - желательно с необязательной привязкой, например

guard let eventStream = FSEventStreamCreate(...) else {
     // handle error ...
}

Но на самом деле причиной сбоя программы является принудительное приведение в

FSEventStreamScheduleWithRunLoop(..., CFRunLoopMode.defaultMode as! CFString)

CFRunLoopMode не a CFString, поэтому принудительный as! CFString завершается ошибкой.Это struct CFRunLoopMode: RawRepresentable, а базовый CFString получается с помощью свойства rawValue:

FSEventStreamScheduleWithRunLoop(..., CFRunLoopMode.defaultMode.rawValue)

Примечание: typealias FSEventStreamCallback уже определено в платформе Core Services, нет необходимости дублировать определение в вашем классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...