Как перенести данные из делегата приложения в другой класс - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь передать переменную, содержащую массив, из моего делегата приложения в класс, который я называю DataSource. Но у меня проблемы с передачей данных. Когда я посмотрел и попытался отладить мое приложение, он показал, что переменная в моем классе DataSource не имеет значения, а переменная из моего приложения Delegate имеет значения. Вот мой код, кто-нибудь может мне помочь? [также это я использовал swiftui в этом приложении]

AppDelegate:

import UIKit
import CoreData
import Moya
import Alamofire
import AlamofireImage

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

let service = MoyaProvider<YelpService.BusinessProvider>()
   let jsonDecoder = JSONDecoder()
var theViewModels = [RestrauntListViewModel]()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.



    loadBusinesses()


    return true
}


private func loadBusinesses () {
                    service.request(.search(lat: 34.0016, long: -117.8176)) { (result) in
                        switch result{
                        case.success(let response):
                            print("yaya")
                            let root = try? self.jsonDecoder.decode(Root.self, from: response.data)
                            let viewModels = root?.businesses.compactMap(RestrauntListViewModel.init)
                            let dataSource = DataSource()
                            dataSource.arrayOfImages.removeAll()
                            for image in viewModels! {

                                Alamofire.request(image.imageURL).responseImage { response in
                                    if let image = response.result.value {
                                        print("image downloaded appdelegate")
                                        dataSource.arrayOfImages.append(image)
                                        print(dataSource.arrayOfImages)
                                    } else {
                                        print("ERROR: image does not = response.result.value")
                                    }
                                }
                            }

                            self.theViewModels = (root?.businesses.compactMap(RestrauntListViewModel.init))!
                            print("the constant theViewModels in the appdelegate has \(self.theViewModels.count) values")

                        case .failure(let error):
                            print("Error: \(error)")
                        }
    }
}

Источник данных:

class DataSource {
    let appDelegate = AppDelegate()
    var arrayOfImages = [UIImage(named: "placeholder")]

}

1 Ответ

0 голосов
/ 27 февраля 2020

Вот минимальный пример, который объясняет мой комментарий:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var arrayOfData = [Int]()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        arrayOfData.append(1)
        arrayOfData.append(2)
        arrayOfData.append(3)

        return true
    }

Тогда в вашем V C вы можете получить доступ к вашему массиву, получив ссылку на делегат приложения:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Get the data from app delegate
        let appDelegate = UIApplication.shared.delegate as? AppDelegate
        print(appDelegate?.arrayOfData)
    }

}

В вашем указанном c коде вы можете переместить эту строку, где вы создаете источник данных:

let dataSource = DataSource()

, чтобы быть чуть выше того места, где вы объявляете свои модели представления (theViewModels), чтобы вы могли ссылаться на него откуда-то, как я это делал с arrayOfData.

Вы также можете сделать вашу собственность частной и получить к ней доступ через геттер, чтобы придерживаться обычной практики программирования.

Можно найти больше примеров. здесь, хотя принятый ответ предназначен для Objective- C:

Передача данных от делегата приложения в View Controller

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

...