Я использую библиотеку Cache "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()
}
}
}
}
}