用于检查数据和存储在Swift中运行两次的数据的代码

时间:2016-09-18 20:09:20

标签: ios arrays swift loops dictionary

我刚刚完成了大量代码的编码,即使它运行正常,但问题是每当我调用编写代码的方法时代码都会运行两次。复制整个代码块可能没用,因为它只会让你感到困惑,但我可以解释一下代码的结构。我怀疑问题在于方法的结构。

func methodName {

    if thisConditionIsTrue {

        // This condition is true, so it gets executed: it retrieves an array of dictionaries from the database

        for-in loop {
            // This loop runs through all of the retrieved dictionary objects

            if dictionaryMeetsThisRequirement {
                // False condition, so it doesn't get executed
            else if dictionaryMeetsThisRequirement {
                // False condition, so it doesn't get executed
            else if dictionaryMeetsThisRequirement {
                // False condition, so it doesn't get executed
            else {
                // True condition, so it gets executed: now it stores data form the client into the database

代码非常复杂并且包含大量的个人信息,所以不幸的是我不能复制它并在此处发布,但我希望它的简化版本仍然可以让每个人都能理解它。我正在处理的问题是,只有代码的最后一部分(我假设,不确定)会被执行两次,这意味着我想要存储在我的数据库中的任何内容都会被存储两次。我也有一个视图转换发生在代码的末尾,也会被触发两次,所以基本上每当调用此方法时,我都会看到一个视图转换发生两次,就像一瞬间。我假设它只运行代码的最后一部分两次的原因是因为我认为它与for-in循环有关(它发生在进程的中间某处)。我认为这是我可以检查从数据库中检索的字典数组中的每个字典的唯一方法,但问题是用于在数据库中存储数据的代码也写在for-in循环中。因此,每当循环决定再次运行时(由于某种原因),它可能会执行true" else"再次声明,导致else语句中的每个代码执行两次。谁可以纠正我或确认这可能确实是我的问题的原因?只有,如果是的话,我是否也可以获得一些关于在不使用for-in循环的情况下运行字典数组的最有效方法的技巧?

2 个答案:

答案 0 :(得分:1)

你不需要使用in循环,因为字典没有被排序,这就是美丽。你唯一要做的就是

1.如果您想检查字典中是否存在密钥

if  dictionary[keyname] != nil {
   //perform some action
}

2.如果您想检查key的值是否等于您正在检查的某个变量

if  dictionary[keyname] == variableYouAreCheckingAgainst {
   //perform some action
}

答案 1 :(得分:0)

是的,for-in循环的整个代码块将被执行多次,对于数组中的每个字典都会执行一次。如果有几个词典符合最终else子句的相关标准,那么,是的,它将被执行几次。如果您的代码只需要执行一次,如果任何字典符合相关条件,请设置一个标志并在for-in循环完成后对其进行测试:

if thisConditionIsTrue {

    // This condition is true, so it gets executed: it retrieves an array of dictionaries from the database
    var oneOffProcessRequired = false
    for-in loop {
        // This loop runs through all of the retrieved dictionary objects

        if dictionaryMeetsThisRequirement {
            // False condition, so it doesn't get executed
        else if dictionaryMeetsThisRequirement {
            // False condition, so it doesn't get executed
        else if dictionaryMeetsThisRequirement {
            // False condition, so it doesn't get executed
        else {
            // True condition, so it gets executed: set the flag
            oneOffProcessRequired = true
        }
    }
    if oneOffProcessRequired == true {
        // flag is true, so store data form the client into the database
    }

或者,如果您想在其中一个词典满足最终else子句的条件时放弃for-in循环,只需使用break来终止循环。

此外,通过抛出一些print语句和/或使用一些断点并逐步执行来尝试跟踪执行流程可能会有所帮助。