块保证局部变量将在Swift中修改吗?

时间:2016-06-23 17:38:57

标签: ios swift cocoa

func foo() -> Bool {
    var apiResult : Bool = false
    myAPI.bar() { (result: Bool) -> Void in
        // some logic in block and local variable assignment
        apiResult = result
    }
    return apiResult
}

传递的块是否保证apiResult的值更新? (我是一名学习iOS的大学生,所以请尽量提供信息)

2 个答案:

答案 0 :(得分:4)

您正在将闭包(块)传递给myAPI.bar函数。该函数可能会也可能不会调用闭包。如果调用闭包,那么apiResult将会改变。在函数foo返回后,可能会发生更改,具体取决于myAPI.bar的实现方式。

答案 1 :(得分:2)

这是一个线程问题。很多时候闭包表明某种逻辑将异步执行。在你的情况下,你有一个api闭包,我认为这意味着你正在执行某种网络请求。这导致函数foo开始,分配apiResult,在行中触发闭包,然后立即返回apiResult,这将是false

您通过网络调用看到的一个常见问题是让调用函数在其声明中包含一个闭包。

func foo(completion: Bool -> Void) {
    myAPI.bar() { (result: Bool) -> Void in
        // some logic in block and local variable assignment
        completion(result)
    }
}

当您致电foo()时,它将如下所示:

    foo { (apiResult) in
        // apiResult will equal the result of your apiRequest
    }

您可以立即返回结果的一种方法是,如果您恰好有适当的缓存系统。您可以从缓存中提取并返回该结果(如果存在)。如果它不存在,您可以继续前进并运行异步请求。通常在数据库中可以看到这种设置,但是,图像缓存使用与此几乎完全相同的东西。 “我需要照片xyz”,检查我的缓存以查看它是否已经存在,如果它确实返回,如果没有,则点击网络并在完成后返回值。