当前位置: 首页 > 知识库问答 >
问题:

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

司寇阳朔
2023-03-14

我从应用程序启动时的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个答案

南门宇
2023-03-14

首先,删除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前缀。这可能会导致意外的行为。

 类似资料:
  • 问题内容: 我将大约400万个不同的键放入Python字典中。创建此字典大约需要15分钟,并且会消耗我的计算机上大约4GB的内存。完全创建字典后,查询字典很快。 我怀疑字典的创建会消耗大量资源,因为字典经常被重新整理(因为字典的数量巨大地增长)。是否可以在Python中创建具有一些初始大小或存储桶编号的字典? 我的字典从数字指向一个对象。 问题答案: 对于性能问题,总是最好进行衡量。以下是一些时间

  • 假设我有2个或更多异步调用: 在脚本的后面,我想确保在使用变量之前设置了它们。 此示例代码遵循angularjs中的Firebase示例。 有什么想法吗?

  • 问题内容: 我有一个字典列表,它们在列表中都具有相同的结构。例如: 我想从列表中的每个字典中获取每个项目: 我当然可以遍历列表并使用for循环提取每个值: 但是我的数据集很大。我想知道是否有更快的方法。 问题答案: 如果只需要迭代一次值,请使用生成器表达式: 另一个(深奥的)选项可能与-一起使用-它可能会比生成器表达式快一点,或者不快一点,具体取决于情况: 而且,如果您绝对需要一个列表,则列表理解

  • 问题内容: 我需要一些帮助来理解为什么此代码无法按预期工作。 如果要更改词典的键但保留值,则可以使用: 我想修改所有键(并将值保留在适当的位置),但是下面的代码跳过了某些行-(“ col2”)保持不变。是因为字典是无序的,而且我不断更改其中的值吗? 在不创建新字典的情况下如何更改键并保留值? 问题答案: 更改要迭代的对象绝不是一个好主意。通常,尝试时甚至会引发异常: RuntimeError:词典

  • 问题内容: 假设我有一本字典,其中的键映射为整数,例如: 是否有返回值的总和在语法上简约的方式-即在这种情况下? 问题答案: 如您所料:

  • 问题内容: 将log4j添加到我的应用程序后,每次执行我的应用程序时,都会得到以下输出: 看来这意味着缺少配置文件。此配置文件应位于何处,什么是良好的入门内容? 我使用纯Java开发桌面应用程序。因此没有网络服务器等… 问题答案: 默认情况下,在上查找名为或的文件。 您可以按照此处所述通过设置系统属性来控制它用来初始化自身的文件(查找“默认初始化过程”部分)。 例如: 将导致在类路径上查找名为的文