Как установить данные ответа в виджет TodayExtenstion - PullRequest
2 голосов
/ 24 апреля 2019

Попытка получить доступ к данным ответа из службы для отображения в виджете TodayExtenstion

import Foundation

struct MarketIndex:Codable {

    let indicesName: String
    let indicesValue: String
    let dateValue : String
    let indicesChangeValue : String
    let changePercentage : String
    let indexVolume: String?
}

struct MarketIndexCache {
    static let key = "MARKET_INDEX_KEY"
    static func save(_ value: [MarketIndex]!) {
        UserDefaults.standard.set(try? PropertyListEncoder().encode(value), forKey: key)
    }
    static func get() -> [MarketIndex]! {
        var marketIndex: [MarketIndex]!
        if let data = UserDefaults.standard.value(forKey: key) as? Data {
            marketIndex = try? PropertyListDecoder().decode([MarketIndex].self, from: data)
            return marketIndex!
        } else {
            return marketIndex
        }
    }
    static func remove() {
        UserDefaults.standard.removeObject(forKey: key)
    }
}

MarketIndexClient Фрагмент кода класса вызова службы

marketIndexClient.fetchMarketIndex(symbol: "AAPL,MSFT"){ marketIndex in
    self.stockIndex = marketIndex
    completion()
    MarketIndexCache.save(self.stockIndex)
    self.dispatchGroupCalls.leave()

}

При попытке доступа к другому контроллеру представления, способному получить сохраненные данные.

override func viewDidLoad() {
    super.viewDidLoad()
    marketIndex = MarketIndexCache.get()
}

При попытке получить к нему доступ из TodayWidgetViewController возвращает ноль.

import UIKit
import NotificationCenter
class TodayWidgetViewController

    override func viewDidLoad() {
        super.viewDidLoad()

        marketIndex = MarketIndexCache.get()
        print(marketIndex as Any)

    }

Разве UserDefaults для двух целей не будут обмениваться данными друг с другом?

Когда я выбираю target projectName, мне нужно настроить TodayExtenstion, так что оба должны синхронизироваться друг с другом, когда мой проект запускается на устройстве.

Я не могу отладить TodayExtenstionWidget при запуске проекта приложения.

Это мое наблюдение обнаружилось при работе с TodayExtenstion.

Я не могу понять, почему он возвращает ноль!Ваши данные действительно помогут мне достичь этого.

СООБЩЕНИЕ ОБ ОШИБКЕ:

Неожиданно найдено nil при развертывании Необязательное значение Неустранимая ошибка: Неожиданно найдено nil при развертывании Необязательное значение

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Привет, как объяснил @LowKostKustomz, вам нужно активировать группы приложений как в основном приложении, так и в расширении. Затем при сохранении из основного приложения и расширения попробуйте что-то вроде

struct MarketIndexCache {
    static let key = "MARKET_INDEX_KEY"
    static let groupBundleID = <#you group identifier#>
    static func save(_ value: [MarketIndex]!) {
        let defaults = UserDefaults.init(suiteName: groupBundleID)
        defaults?.set(try? PropertyListEncoder().encode(value), forKey: key)
    }
    static func get() -> [MarketIndex]! {
        var marketIndex: [MarketIndex]!
        if let data = defaults?.value(forKey: key) as? Data {
            let defaults = UserDefaults.init(suiteName: groupBundleID)
            marketIndex = try? PropertyListDecoder().decode([MarketIndex].self, from: data)
            return marketIndex!
        } else {
            return marketIndex
        }
    }
    static func remove() {
        let defaults = UserDefaults.init(suiteName: groupBundleID)
        defaults?.removeObject(forKey: key)
    }
}
1 голос
/ 02 мая 2019

Для вашей цели вы должны использовать группы приложений.Это распространенный сценарий, вы можете прочитать об этом здесь в разделе «Обмен данными с вашим приложением».Затем вы можете углубиться и прочитать о Как добавить приложение в группу приложений .

Это позволяет вам обмениваться данными между вашим расширением и содержащим его приложением.Но это не даст вам возможности наблюдать за изменениями данных.

Надеюсь, это поможет, не стесняйтесь задавать вопросы.

...