iCloud NSMetadataQuery y actualizaciones (NSMetadataQueryUpdateChangedItemsKey)

Estoy monitoreando mi sandbox de iCloud (iOS) con NSMetaDataQuery , y todo está funcionando bien.

Estoy intentando utilizar NSMetadataQueryUpdateChangedItemsKey en NSMetadataQueryDidUpdateNotification para actualizar eficientemente mi model interno del sistema de files. Desafío que tengo es que cuando un file se mueve / cambia el nombre, ¿cómo puedo saber la ruta del file original para que pueda actualizar mi model?

Parece que los objects NSMetaDataItem son persistentes (es decir, la misma instancia de object se actualiza cuando cambia la ruta), por lo que podría usar el valor de puntero como una especie de índice en mi model. Sin embargo, estaría aprovechando un aparente detalle de implementación (que podría cambiar). ¿Quizás NSMetaDataItems se recicla cuando la memory se agota?

Cualquiera sabe cómo debe hacerse esto (o si en realidad es el caso que los objects NSMetaDataItem persistan durante la vida útil de NSMetaDataQuery , y permanezcan 'adjuntos' en el mismo elemento del sistema de files).

    Sí, NSMetadataQuery no proporciona una forma de consultar la ruta anterior.

    Cuando se mueve un elemento, su índice en los resultados de NSMetadataQuery sigue siendo el mismo. Para que podamos duplicar la ruta de los resultados y cuando comience la actualización, solo debemos verificar el NSMetadataItem en la position exacta de la matriz duplicada.

      if let updatedObj = obj.userInfo?[NSMetadataQueryUpdateChangedItemsKey] as! [NSMetadataItem]? { for it in updatedObj { let url = it.valueForAttribute(NSMetadataItemURLKey) as! NSURL let value = it.valueForAttribute(NSMetadataUbiquitousItemIsUploadedKey) as! NSNumber print("Path: " + url.path!) print("Updated: " + value.stringValue) let index = metaDataQuery.indexOfResult(it) let prevPath = duplicatedPathArray[index] if (prevPath != url.path!) { print("File Moved. Previous path: " + prevPath) duplicatePath() } } } 

    Asegúrese de actualizar la matriz cada vez que se agrega o elimina un file.

    La documentation menciona que los resultados son adecuados para Cocoa Bindings, lo que significa que es probable que esos objects sean persistentes.

    Utilizo más combinación hardcore de NSFilePresenter y NSMetadataQuery corriendo lado a lado para monitorear documentos en contenedor. NSFilePresenter tiene una API conveniente para detectar cuándo se movían los files:

    func presentedSubitem(at oldURL: URL, didMoveTo newURL: URL)

    Para que funcione, sin embargo, cuando mueve files en un contenedor, debe notificar explícitamente al coordinador de files que está moviendo el file (vea los puntos 1-3):

     let fc = NSFileCoordinator() var error: NSError? fc.coordinate(writingItemAt: from, options: .forMoving, writingItemAt: to, options: .forReplacing, error: &error, byAccessor: { (fromURL, toURL) in do { // 1 fc.item(at: fromURL, willMoveTo: toURL) try FileManager.default.moveItem(at: fromURL, to: toURL) // 2 fc.item(at: fromURL, didMoveTo: toURL) } catch { // 3 fc.item(at: fromURL, didMoveTo: fromURL) } })