如何使用Cache库添加JSON数据

问题描述 投票:1回答:1

我正在使用“hyperoslo”的缓存库。(https://github.com/hyperoslo/Cache#handling-json-response

我尝试将swift 3.x更新为4.2。但是我有两个关于将Json数据添加到缓存的错误。

关于Cannot convert value of type 'Data' to expected argument type 'String'的错误消息之一。

func set(_ object: SwiftyJSON.JSON, for key: String) {
    guard let data = try? object.rawData() else { return }
    cache?.setObject(data, forKey: key)
}

另一个是关于Cannot convert value of type '()?' to closure result type 'Disposable'

我在这段代码中遇到了这个错误。

self?.cache?.async.object(forKey: key) { result in

我无法理解如何将JSON数据放入缓存。

我尝试将.add(key, object: data)的代码更改为.async.setObject。但我无法理解如何使用setObject

这是缓存的所有代码。

import Foundation
import Cache
import SwiftyJSON
import RxSwift
import Async

final class CacheService {

    // MARK: - Properties
    static let shared = CacheService()

    fileprivate let cache = try? Storage(
        diskConfig: DiskConfig(name: "ReadGirl.JSONCache"),
        memoryConfig: MemoryConfig(expiry: .never, countLimit: 10, totalCostLimit: 10),
        transformer: TransformerFactory.forCodable(ofType: String.self) // Storage<User>
    )

    // MARK: - Enum Values
    enum Service: String {
        case book = "Readgirl.JSONCache.book"
        case thread = "Readgirl.JSONCache.thread"
        case sound = "Readgirl.JSONCache.sound"
    }

}

// MARK: - Save
extension CacheService {
    func set(_ object: SwiftyJSON.JSON, for service: Service) {
        set(object, for: CacheService.Service(rawValue: service.rawValue)!)
    }
    func set(_ object: SwiftyJSON.JSON, for key: String) {
        guard let data = try? object.rawData() else { return }
        cache?.setObject(data, forKey: key) <-- ERROR : Cannot convert value of type 'Data' to expected argument type 'String'
    }

}

// MARK: - Load
extension CacheService {
    func object(for service: Service) -> Observable<SwiftyJSON.JSON?> {
        return object(for: CacheService.Service(rawValue: service.rawValue)!)
    }

    func object(for key: String) -> Observable<SwiftyJSON.JSON?> {
        return Observable.create { [weak self] observer in
            //self?.cache?.async.object(forKey: key) { (data: Data?) in
            self?.cache?.async.object(forKey: key) { result in <-- ERROR : Cannot convert value of type '()?' to closure result type 'Disposable'
                switch result {
                    case .value(let data):
                        Async.userInteractive {
                            let json = SwiftyJSON.JSON(data: data)
                            Async.main {
                                if let error = json.error {
                                    observer.onError(error)
                                } else {
                                    observer.onNext(json)
                                }
                                observer.onCompleted()
                            }
                        }
                case .error(let error):
                    observer.onNext(nil)
                    observer.onCompleted()
                }
            }
        }
    }
}

swift
1个回答
0
投票

使用setObject而不是add(key:如下,

func set(_ object: SwiftyJSON.JSON, for key: String) {
    guard let data = try? object.rawData() else { return }
    cache?.setObject(data, forKey: key)
}

并使用Result<Type>storage检索所需的对象,如下所示,

self?.cache?.async.object(forKey: key) { result in
  switch result {
    case .value(let data):
         Async.userInteractive {
           let json = SwiftyJSON.JSON(data: data)

            Async.main {
                if let error = json.error {
                    observer.onError(error)
                } else {
                   observer.onNext(json)
                }
                observer.onCompleted()
            }
         }
    case .error(let error):
      observer.onNext(nil)
      observer.onCompleted()
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.