Как получить доступ к значению ресурса ubiquitousItemDownloadingStatus? - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть код для получения значения ресурса ubiquitousItemDownloadingStatus для URL:

    do {

        let resourceValues = try item.url.resourceValues(forKeys: [URLResourceKey.ubiquitousItemDownloadingStatusKey]

    } catch {

        print(error.localizedDescription)

    }

Однако я не знаю, что делать со значением.Я могу получить доступ к значению ресурса с помощью следующего кода:

    do {

        let resourceValues = try item.url.resourceValues(forKeys: [URLResourceKey.ubiquitousItemDownloadingStatusKey])

        resourceValues.ubiquitousItemDownloadingStatus // ???

    } catch {

        print(error.localizedDescription)

    }

Но я не уверен, что делать после этого.Объявление значения ресурса в базовой библиотеке представляет собой следующую структуру:

public struct URLUbiquitousItemDownloadingStatus : Hashable, Equatable, RawRepresentable {

    public init(rawValue: String)
}
extension URLUbiquitousItemDownloadingStatus {

    @available(iOS 7.0, *)
    public static let notDownloaded: URLUbiquitousItemDownloadingStatus

    @available(iOS 7.0, *)
    public static let downloaded: URLUbiquitousItemDownloadingStatus

    @available(iOS 7.0, *)
    public static let current: URLUbiquitousItemDownloadingStatus
}

Я в замешательстве, потому что ожидаю перечисления.

Пожалуйста, если кто-то может помочь прояснить это дляя был бы признателен.

Ответы [ 2 ]

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

Xcode 10.1.Swift 4.2.

let url = "yourURL" as! URL
    do {
        let attributes = try url.resourceValues(forKeys: [.ubiquitousItemDownloadingStatusKey])
        if let status = attributes.allValues[.ubiquitousItemDownloadingStatusKey] as? URLUbiquitousItemDownloadingStatus {
            if status == URLUbiquitousItemDownloadingStatus.current {
                print("\nURLUbiquitousItemDownloadingStatus.current")

            } else if status == URLUbiquitousItemDownloadingStatus.downloaded {
                print("\nURLUbiquitousItemDownloadingStatus.downloaded")

            } else if status == URLUbiquitousItemDownloadingStatus.notDownloaded {
                print("\nURLUbiquitousItemDownloadingStatus.notDownloaded")

            }

        }
    } catch {

    }
0 голосов
/ 22 декабря 2018

Не волнуйся;это не работает для меня, но вот что я попробовал:

Я заключил доступ в var ...

var ubiquityDownloadStatus: URLUbiquitousItemDownloadingStatus? {
    get {
        do {
            let keyValues = try rootURL.resourceValues(forKeys: [.ubiquitousItemIsDownloadingKey])
            return keyValues.ubiquitousItemDownloadingStatus
        } catch {
            os_log("Error checking download status of %s", log: .default, type: .error, rootURL.lastPathComponent)
        }
        return nil
    }
}

... затем используйте его таким образом:

private func statusImage(forNode node: DirectoryNode) -> NSImage? {
    if !node.isUbiquitousItem { return nil }
    let status = node.ubiquityDownloadStatus
    switch status {
    case URLUbiquitousItemDownloadingStatus.current:
        return NSImage(named: NSImage.statusAvailableName)
    case URLUbiquitousItemDownloadingStatus.downloaded:
        return NSImage(named: NSImage.statusPartiallyAvailableName)
    case URLUbiquitousItemDownloadingStatus.notDownloaded:
        return NSImage(named: NSImage.statusUnavailableName)
    default:
        return NSImage(named: NSImage.statusNoneName)
    }
}

... но в результате я всегда получаю nil.

Я пытался добавить права iCloud в свое приложение безрезультатно.Затем я изучаю это альтернативное решение, которое в любом случае может лучше удовлетворить мои потребности.

Какао - Как обнаружить изменение в повсеместном контейнере

...