Swift не запускается последовательно - PullRequest
0 голосов
/ 21 января 2019

Я новичок в Свифте.У меня есть небольшое приложение, которое проверяет, появляется ли номер телефона больше 1 в тот же день, тогда мое приложение должно остановиться и выдать ошибку

Я пробовал несколько способов, но мне кажется, что код пропускает часть, которая проверяет телефонномер в тот же день и переходит к следующему шагу.

import UIKit
import Firebase
//import FirebaseAuth
//import FirebaseDatabase
var ref_login: DatabaseReference!
var refTransaction: DatabaseReference!
var refcustomerdetails: DatabaseReference!
var refcountcheckin: DatabaseReference!
var CustomerName =    String()
class ViewController: UIViewController {



    @IBOutlet weak var nameText: UITextField!

    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var phoneText: UITextField!
    @IBOutlet weak var errorText: UILabel!


    override func viewDidLoad() {
        super.viewDidLoad()


        ref_login = Database.database().reference()



        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func loginPressed(_ sender: Any) {
        if self.phoneText.text == "" {
        print("Phone is empty")
        self.errorText.text = "Phone is empty."
        return
        }

        if self.phoneText.text == "000000000" {
            switchownerScreen()
        }
        else {
                    Auth.auth().signIn(withEmail: phoneText.text! + "@gmail.com", password: "fingerjoynails", completion: {(user, error) in
                        if error != nil {
                            print(error)
                            self.errorText.text = "Phone does not exist in system."
                            return
                        }
                        if error == nil {
                            print("self.phoneText.text!",self.phoneText.text!)
                            //Start checking duplicate checking in the same day
                            //Start Date to query
                            let dformatter = DateFormatter()
                            dformatter.dateFormat = "yyyy-MM-dd"
                            let dmyString = dformatter.string(from: Date())
                            let dyourDate = dformatter.date(from: dmyString)
                            dformatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
                            let dmyStringafd = dformatter.string(from: dyourDate!)
                            print("dmyStringafd:------",dmyStringafd)

                            refcountcheckin = Database.database().reference().child("Transactions")
                            let query = refcountcheckin.queryOrdered(byChild: "CHECK_IN_DATE").queryStarting(atValue: dmyStringafd)
                            query.observe(.value, with: { (snapshot) in
                                print("snapshot.childrenCount:----",snapshot.childrenCount)
                                if snapshot.childrenCount>0{
                                    for transactions in snapshot.children.allObjects as![DataSnapshot]{
                                        let transactionObject = transactions.value as? [String: AnyObject]
                                        let transactionPhone = transactionObject?["PHONE"]
                                        let checkPhone = transactionPhone as! String?
                                        print("self.phoneText.text!",self.phoneText.text!)
                                        if checkPhone == self.phoneText.text! {
                                            self.errorText.text = "You already checked in on today."
                                            print("You already checked in on today.")
                                            return
                                        }

                                    }
                                }
                            })
                            //End checking duplicate checking in the same day

                            let phone = self.phoneText.text!
                            //let name = self.nameText.text!
                            let formatter = DateFormatter()
                            // initially set the format based on your datepicker date / server String
                            formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
                            let myString = formatter.string(from: Date()) // string purpose I add here
                            // convert your string to date
                            let yourDate = formatter.date(from: myString)
                            //then again set the date format whhich type of output you need
                            formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
                            // again convert your date to string
                            let myStringafd = formatter.string(from: yourDate!)
                            refcustomerdetails = Database.database().reference().child("Users")
                            let customerdetailsquery = refcustomerdetails.queryOrdered(byChild: "PHONE").queryEqual(toValue: self.phoneText.text!)
                            customerdetailsquery.observe(.value, with: { (snapshot) in
                                if snapshot.childrenCount>0{
                                    for transactions in snapshot.children.allObjects as![DataSnapshot]{
                                        let customerdetailsObject = transactions.value as? [String: AnyObject]
                                        let customerFirstName = customerdetailsObject?["FIRST_NAME"]
                                        let customerLastName = customerdetailsObject?["LAST_NAME"]
                                        let firstname   = customerFirstName as! String?
                                        let lastname = customerLastName as! String?
                                        CustomerName = firstname! + " " + lastname!
                                    }
                                }
                            })
                            ref_login?.child("Transactions").childByAutoId().setValue(["PHONE": phone, "NAME": CustomerName,"CHECK_IN_DATE": myStringafd, "GIFT_CARD_NUMBER": "N"])
                            print("Insert into transaction complete.")
                            self.switchScreen()
                        }
                    })
            }
    }

    func switchScreen() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "usersVC")
        self.present(controller, animated: true, completion: nil)
    }

    func switchownerScreen() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "ownerVC")
        self.present(controller, animated: true, completion: nil)
    }

    func assignbackground(){
        let background = UIImage(named: "login.jpg")

        var imageView : UIImageView!
        imageView = UIImageView(frame: view.bounds)
        imageView.contentMode =  UIViewContentMode.scaleAspectFill
        imageView.clipsToBounds = true
        imageView.image = background
        imageView.center = view.center
        view.addSubview(imageView)
        self.view.sendSubview(toBack: imageView)
    }



}

В журнале я вижу, как приложение вставляет запись перед проверкой существующего состояния.Моя цель состоит в том, чтобы, если телефонный номер уже был добавлен в таблицу транзакций на сегодняшний день, мы НЕ должны позволять конечному пользователю снова вводить его.

Файл журнала:

2019-01-20 16:02:50.096558-0800 checkinuser[8558:381633] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C4.1:2][0x7ff55fe02870] get output frames failed, state 8196
2019-01-20 16:02:50.096717-0800 checkinuser[8558:381633] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C4.1:2][0x7ff55fe02870] get output frames failed, state 8196
self.phoneText.text! 4088584842
2019-01-20 16:02:50.097999-0800 checkinuser[8558:381633] TIC Read Status [4:0x0]: 1:57
2019-01-20 16:02:50.098397-0800 checkinuser[8558:381633] TIC Read Status [4:0x0]: 1:57
dmyStringafd:------ 2019-01-20 00:00:00
Insert into transaction complete.
snapshot.childrenCount:---- 10
self.phoneText.text! 4088584842
You already checked in on today.
2019-01-20 16:02:50.260980-0800 checkinuser[8558:381633] 5.15.0 - [Firebase/Database][I-RDB034028] Using an unspecified index. Your data will be downloaded and filtered on the client. Consider adding ".indexOn": "CHECK_IN_DATE" at /Transactions to your security rules for better performance

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Это потому, что вы выполняете запрос, который занимает много времени, и вы пытаетесь заблокировать вставку, если есть дубликат, запустив return внутри функции.Это означает, что если запрос не обрабатывается и не достигает оператора return до того, как остальная часть метода может быть выполнена, оператор return не будет иметь времени для выполнения.Как уже упоминалось в другом ответе, использование обработчика завершения, вероятно, является правильным шагом, но вы также можете просто переместить всю логику после дублированной проверки в оператор else, сопровождающий if checkPhone == self.phoneText.text!, или переместить его в новую функциюи вызовите эту функцию оттуда:

if checkPhone == self.phoneText.text! {
    self.errorText.text = "You already checked in on today."
    print("You already checked in on today.")
}else{
    self.yourNewInsertPhoneNumberFucntion()
}
0 голосов
/ 21 января 2019

Вам не хватает некоторого асинхронного понимания.

Вы можете начать с просмотра этого ответа: https://stackoverflow.com/a/46245943/8869493

Тот факт, что "не в последовательности" является преднамеренным, это асинхронные задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...