Домен ошибки = NSCocoaErrorDomain Code = 3840 & quot; Нет значения. & Quot;

Я создал скрипт для входа в мое приложение. Пользователь вводит свое имя пользователя и пароль, а затем я отправляю эти значения на сервер. У меня есть скрипт php для проверки значений базы данных, а затем я возвращаю кодированный в json массив обратно в мое приложение. Я анализирую результат, сохраняю значения в userdefaults и затем перехожу в приложение. Все было хорошо, пока я не реализовал другую функцию, чтобы вернуть цитату из базы данных.

Ошибка чрезвычайно своеобразна, потому что это происходит не каждый раз, но достаточно часто, что это вызывает проблему. Я не понимаю почему


стриж:

let myUrl = NSURL(string: "https://www.example.com/scripts/userLogin.php");
let request = NSMutableURLRequest(url:myUrl! as URL)

request.httpMethod = "POST";
let postString = "username=\(username)&password=\(password)";
request.httpBody = postString.data(using: String.Encoding.utf8);

let task = URLSession.shared.dataTask(with: request as URLRequest){
data, response, error in

if error != nil {
print("error=\(String(describing: error))")
return
}

// Parse the results of the JSON result and naivigate to app if success
var err: NSError?
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = json {

let resultValue:String = parseJSON["status"] as! String;

if (resultValue == "Success"){

let storedUserID: String = parseJSON["user_id"] as! String;
let storedUsername: String = parseJSON["username"] as! String;
let storedFirstname: String = parseJSON["firstname"] as! String;
let storedSurname: String = parseJSON["surname"] as! String;
let storedUniName: String = parseJSON["uni_name"] as! String;
let storedUniCourse: String = parseJSON["uni_course"] as! String;
let storedEmail: String = parseJSON["email"] as! String;
let storedVerificationCode: String = parseJSON["verification_code"] as! String;
let theQuote: String = parseJSON["quote"] as! String

let array = [storedUserID, storedUsername, storedFirstname, storedSurname, storedUniName, storedUniCourse, storedEmail, storedVerificationCode, theQuote]

UserDefaults.standard.set(array, forKey: "UserDetailsArray");
UserDefaults.standard.set(true, forKey: "isUserLoggedIn");
UserDefaults.standard.synchronize();

print("Successfully logged in with:")
print(array)

DispatchQueue.main.async{
let mainTabBar = self.storyboard?.instantiateViewController(withIdentifier: "mainTabBar") as! UITabBarController;
let appDelegate = UIApplication.shared.delegate as! AppDelegate;
appDelegate.window?.rootViewController = mainTabBar
}
}
}
} catch let error as NSError {
err = error
print(err!);
}
}
task.resume();

PHP:

$check = query_mysql("SELECT * FROM users WHERE username='".$username."'");

if ($check->num_rows == 0) {
$returnValue["status"] = "Error";
$returnValue["message"] = "No such details found on server";
echo json_encode($returnValue);
} else {
while ($row = $check->fetch_assoc()){
$storedUserID       = $row['user_id'];
$storedUsername     = $row['username'];
$storedfirstname    = $row['firstname'];
$storedsurname      = $row['surname'];
$storedPass         = $row['password'];
$storedUniName      = $row['uni_name'];
$storedUniCourse    = $row['uni_course'];
$storedEmail        = $row['email'];
$storedVerificationCode = $row['unique_code'];
$verified           = $row['verified'];
}

if ($storedPass != $password ) {
$returnValue["status"] = "Failed";
$returnValue["message"] = "The user and password combination do not match";
echo json_encode($returnValue);

} elseif ($verified == 0){
$returnValue["status"] = "Unverified";
$returnValue["message"] = "The email associated with this account has not been verified";
echo json_encode($returnValue);

} else {

// Retrieve a motivational quote
$get_quote = query_mysql("SELECT quote FROM study_quotes ORDER BY rand() LIMIT 1");

if (!$get_quote){
$returnValue["quote"] = "Failed";
} else {
while ($row = $get_quote->fetch_assoc()) $returnValue["quote"] = $row['quote'];
}

$returnValue["status"]              = "Success";
$returnValue["user_id"]             = $storedUserID;
$returnValue["username"]            = $storedUsername;
$returnValue["firstname"]           = $storedfirstname;
$returnValue["surname"]             = $storedsurname;
$returnValue["uni_name"]            = $storedUniName;
$returnValue["uni_course"]          = $storedUniCourse;
$returnValue["email"]               = $storedEmail;
$returnValue["verification_code"]   = $storedVerificationCode;
echo json_encode($returnValue);

База данных:

Имеет таблицу с идентификатором и кавычкой (предварительно заполненную моими собственными данными, к которым у пользователя нет доступа. Я знаю, что всегда будут присутствовать строки, поэтому я никогда не проверяю num_rows но только если запрос не удался)


использование:

Я использую UserDefaults, потому что на следующем экране я использую восьмой индекс (который является цитатой), чтобы установить в качестве метки:

let userDetails: [String] = UserDefaults.standard.stringArray(forKey:"UserDetailsArray")!
self.quoteLabel.text = userDetails[8]

Кажется, у меня 50% успеха и 50% неудач. Я получу ошибку:

Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value.}

0

Решение

Благодаря rmaddy за помощь. Я нашел хак, который, кажется, работает для того, чтобы в основном запускать функцию каждый раз, пока возвращаемый набор данных не будет пустым, но я уверен, что это не то, что нужно делать, даже если он работает, поэтому любая помощь все равно будет оценена:

            } catch let error as NSError {
let dataSet = String(data: data!, encoding: .utf8)

print("Trying again")
if (dataSet?.isEmpty)!{
self.LoginButtonTapped(self)
}

err = error
print(err!);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]