我正在使用以下代码检索NSURLCredentials
:
let credentials: NSURLCredential? = {
let loginProtectionSpace = NSURLProtectionSpace(host: host, port: 0, protocol: NSURLProtectionSpaceHTTP, realm: nil, authenticationMethod: NSURLAuthenticationMethodDefault)
let credentials = NSURLCredentialStorage.sharedCredentialStorage().defaultCredentialForProtectionSpace(loginProtectionSpace)
return credentials
}()
用户打开应用程序时会调用此方法。返回的凭据为零。然后我设置这些凭据并尝试再次打印凭证,它仍然是零。但是,如果我重新启动应用程序,则会显示打印的凭据。这是怎么回事?
答案 0 :(得分:1)
这是一个懒惰的变量。首次访问该属性时,代码将执行一次。在那之后,最初返回的值是"记住"并在将来的电话中返回。
如果您自己在NSURLCredentialStorage
中设置凭据,那么在下次启动应用时,属性的第一次访问将再次执行代码并检索存储的凭据。请注意,在您首次设置凭据的运行期间,从存储中检索凭据的实际3行代码不会再次执行,因此在应用程序运行期间,属性仍为nil
是存储中的值。如果您修改现有凭据,也会发生类似情况 - 在您更改它们的运行期间,credentials
仍将保留对先前凭据的引用。
如果您希望能够重新查询商店,则应该
答案 1 :(得分:0)
我怀疑它是因为凭证是不可变的。代码块执行一次以为其分配凭证值。这就是重新启动应用程序后它具有凭据的原因。