2016-05-27 15 views
2

Ich verwende den folgenden Code NSURLCredentials abzurufen:Wie funktioniert diese Funktion/Variable?

let credentials: NSURLCredential? = { 
    let loginProtectionSpace = NSURLProtectionSpace(host: host, port: 0, protocol: NSURLProtectionSpaceHTTP, realm: nil, authenticationMethod: NSURLAuthenticationMethodDefault) 
    let credentials = NSURLCredentialStorage.sharedCredentialStorage().defaultCredentialForProtectionSpace(loginProtectionSpace) 
    return credentials 
}() 

Dies wird aufgerufen, wenn der Benutzer die App öffnet. Die zurückgegebenen Anmeldeinformationen sind null. Dann lege ich diese Anmeldeinformationen fest und versuche, die Anmeldeinformationen erneut auszudrucken, und es ist immer noch Null. Wenn ich die App neu starte, sind die gedruckten Anmeldeinformationen jedoch vorhanden. Was ist denn hier los?

Antwort

1

Dies ist eine faule Variable. Der Code wird beim ersten Zugriff auf die Eigenschaft einmal ausgeführt. Danach wird der anfänglich zurückgegebene Wert "erinnert" und bei zukünftigen Aufrufen zurückgegeben.

Wenn Sie die Anmeldeinformationen selbst in NSURLCredentialStorage festlegen, führt der erste Zugriff der Eigenschaft beim nächsten Start der Anwendung den Code erneut aus und ruft die gespeicherten Anmeldeinformationen ab. Beachten Sie, dass während des Laufs, in dem Sie die Anmeldeinformationen zuerst eingerichtet haben, die tatsächlichen 3 Codezeilen beim Abrufen der Anmeldeinformationen aus dem Speicher nicht ein zweites Mal ausgeführt werden und daher während dieser Ausführung der App weiterhin nil vorhanden ist der Speicher. Eine ähnliche Sache wird passieren, wenn Sie die bestehenden Anmeldeinformationen ändern - während des Laufs, wo Sie sie ändern, wird die credentials immer noch einen Verweis auf die vorherigen enthalten.

Wenn Sie in der Lage sein wollen, um den Speicher zu requery, sollten Sie entweder

0

Ich vermute, es ist, weil Anmeldeinformationen unveränderlich ist. Der Codeblock wird einmal ausgeführt, um den Anmeldeinformationen ihren Wert zuzuweisen. Aus diesem Grund verfügt es über die Anmeldeinformationen, nachdem Sie die App neu gestartet haben.

Verwandte Themen