提问者:小点点

如何确保字典中的所有键都被初始化


我从应用程序启动时的API调用中获取了一堆字符串。我把它们存储在一个字典里,变成一个单例,这样我就可以通过我的应用程序重用它们了。

问题是,在我的字典中初始化所有键之前,调用就完成了,完成就被激发了。什么方法会等待所有的初始化,这样它就不会返回nil了?

下面是我的初始化方法:

    func setLocales(locales: Layout, success: ([String: String]) -> Void) {
        self.layout["infoAllDebates"] = locales.infoAllDebates ?? "Débats"
        self.layout["actionReadMore"] = locales.actionReadMore ?? "Lire plus"
        self.layout["actionSeeMore"] = locales.actionSeeMore ?? "Voir plus"
        self.layout["actionAddArgument"] = locales.actionAddArgument ?? "Ajouter un argument"
        self.layout["actionLinkToDebate"] = locales.actionLinkToDebate ?? "Aller au débat"
        self.layout["actionUpdate"] = locales.actionUpdate ?? "Modifier"
        .... (150 more lines of strings)
        success(self.layout)
    }

completion(这里是success())正在触发,但是当我调用视图中的一个键时,它还没有初始化,所以我得到一个关于该键为nil的错误。

API调用如下所示:

func getSettings(completion: (() -> Void)?) -> () {
        apiClient.getSettings { settings in
            self.setLocales(locales: settings.data.resource.layout, success: { layout in
                DispatchQueue.main.async {
                    if completion != nil {
                        return completion!()
                    }
                }
            })
        }
    }
    

我应该做什么来确保所有的密钥都被初始化?


共1个答案

匿名用户

首先,删除setlocales中的完成处理程序,因为所有内容都是同步的

func setLocales(locales: Layout) {
    self.layout["infoAllDebates"] = locales.infoAllDebates ?? "Débats"
    self.layout["actionReadMore"] = locales.actionReadMore ?? "Lire plus"
    self.layout["actionSeeMore"] = locales.actionSeeMore ?? "Voir plus"
    self.layout["actionAddArgument"] = locales.actionAddArgument ?? "Ajouter un argument"
    self.layout["actionLinkToDebate"] = locales.actionLinkToDebate ?? "Aller au débat"
    self.layout["actionUpdate"] = locales.actionUpdate ?? "Modifier"
    .... (150 more lines of strings)
}

其次,不要返回(第一个)完成处理程序,调用它

func getSettings(completion: (() -> Void)?) {
    apiClient.getSettings { settings in
        self.setLocales(locales: settings.data.resource.layout)
        DispatchQueue.main.async {
           completion?() // The completion != nil check is "unswifty"
        }
    }
}

注意:如果与Objective-C交互,请避免使用getset前缀。这可能会导致意外的行为。