我从应用程序启动时的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!()
}
}
})
}
}
我应该做什么来确保所有的密钥都被初始化?
首先,删除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交互,请避免使用get
和set
前缀。这可能会导致意外的行为。