[英]Class property not assigned inside closure in Swift 2
我在为Swift类中的属性分配值时遇到麻烦。 该属性在类内部可以正常打印,但是当调用在主viewController中分配属性的类方法时,从外部访问该属性将返回nil
。 这是我的班级定义。
import Foundation
class NetworkConnection {
var jsonObj: AnyObject?
func makeHTTPRequest(data: String, location: String, completion: (jsonData: AnyObject?, error: NSError?) -> Void){
var jsonData: AnyObject!
let post: NSString = "data=\(data)"
let url = NSURL(string: location)!
let postData = post.dataUsingEncoding(NSUTF8StringEncoding)!
let postLength = String(postData.length)
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.HTTPBody = postData
request.setValue(postLength, forHTTPHeaderField: "Content-Length")
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { urlData, response, responseError in
if let receiveData = urlData {
let res = response as! NSHTTPURLResponse!
if 200..<300 ~= res.statusCode {
do {
jsonData = try NSJSONSerialization.JSONObjectWithData(receiveData, options: NSJSONReadingOptions.init(rawValue:0))
completion(jsonData: jsonData, error: nil)
} catch let error as NSError {
let returnedError = NSError(domain: "validateUser", code: 3, userInfo: [
"title": "Made up title",
"message": "This is a messsage",
"cause": error
])
completion(jsonData: nil, error: returnedError)
}
}else{
let returnedError = NSError(domain: "validateUser", code: 1, userInfo: [
"title": "Second made up title",
"message": "This is another message"
])
completion(jsonData: nil, error: returnedError)
}
}else{
var userInfo: [NSObject: AnyObject] = [
"title": "Third made up title",
"message": "This is yet another message"
]
if let error = responseError {
userInfo["message"] = error.localizedDescription
userInfo["cause"] = error
}
let returnedError = NSError(domain: "validateUser", code: 2, userInfo: userInfo)
completion(jsonData: nil, error: returnedError)
}
}
task.resume()
}
func validateUser(location: String, username: String, password: String) {
let data = "&username=\(username)&password=\(password)"
self.makeHTTPRequest(data, location: location) { jsonData, error in
if let json = jsonData {
self.jsonObj = json
print(self.jsonObj) // This shows property was assigned without errors
}else{
let userInfo = error!.userInfo
let title = userInfo["title"] as! String
let message = userInfo["message"] as! String
print(title)
print(message)
}
}
}
}
这是我在validatUser()
调用validatUser()
方法的函数
@IBAction func login(sender: AnyObject) {
let service = NetworkConnection()
service.validateUser("http://myPhpServiceLink.com/mobile.login.php", username: usernameField.text!, password: passwordField.text!)
if let serviceObj = service.jsonObj {
print("success loading object \(serviceObj)")
} else {
print("error loading object from call \(service.jsonObj)")
}
}
这是PHP要返回的JSON数据。
{"id":"1","username":"admin","message":"User is valid","error":null}
行: print("service object = \\(self.jsonObj)")
在控制台中输出以下内容:
service object = Optional({
error = "<null>";
id = 1;
message = "User is valid";
username = admin;
})
但是我从@IBAction
函数得到“从调用nil加载错误的对象”。 我到处寻找以找出为什么该属性在外部调用时总是返回nil
,并且也很难阐明我的问题。
我敢打赌这是由于您的http请求是在后台执行的。
if let serviceObj = service.jsonObj
在您的validateUser
方法完成之前正在执行if let serviceObj = service.jsonObj
。 您需要重写`valdiateUser以获取完成处理程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.