委托未从ViewController中的Singleton触发

问题描述

我在一个单例中存储了priestArray。我已经定义了一个协议和一个委托。如果我创建一个类(而不是viewController),则在更改awardArray的值时,代理将按预期触发。但是,在我的viewController中,我无法解雇该委托。您能指出我做错了什么吗?预先非常感谢。

这是单例AppData类

import Foundation

protocol AppDataDelegate {
    func didChange(_ prizeArray: Array<Prize>)
}

class AppData
{
    static let shared = AppData()
    var delegate: AppDataDelegate?
    var parsedPrizes:[Prize] = []
    
    private init() {}
    
    func changeThis(newArray: [Prize]) {
        parsedPrizes = newArray
        print("AppData got parsedPrizes")
        delegate?.didChange(newArray)
    }
}

import UIKit
import CoreData

class GameBoard: FPBViewController,AppDataDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        AppData.shared.delegate = self
    }

    func didChange(_ prizeArray: Array<Prize>) {
        print("data via the delegate prizeArray: \(prizeArray.count)")
    }
}



解决方法

是否还有其他使用AppData的单例委托的类?如果是这样,也许这就是原因...您可能将另一个ViewController重新分配给该代表,而GameBoard停止监听。

编辑; 为了能够通知多个类,您需要像这样保留这些类的多个实例:

import Foundation

protocol AppDataDelegate {
    func didChange(_ prizeArray: Array<Prize>)
}

class AppData
{
    static let shared = AppData()
    var delegates: [AppDataDelegate] = [] <=========== notify every class that listens
    var parsedPrizes:[Prize] = []
    
    private init() {}
    
    func changeThis(newArray: [Prize]) {
        parsedPrizes = newArray
        print("AppData got parsedPrizes")

        delegates.forEach { delegate in <===========
            delegate.didChange(newArray)
        }
    }
}

import UIKit
import CoreData

class GameBoard: FPBViewController,AppDataDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        AppData.shared.delegates.append(self) <===========
    }

    func didChange(_ prizeArray: Array<Prize>) {
        print("data via the delegate prizeArray: \(prizeArray.count)")
    }

    @IBAction func closeVC(_ sender: Any) {
        if let index = AppData.shared.delegates.firstIndex(where: { $0 === self }) {
            AppData.shared.delegates.remove(at: index)
        }
    
        // -------------------------------------------
    
        self.dismiss(animated: true,completion: nil)
    }
}