ios - 带事件指示器的登录功能

标签 ios swift asynchronous authentication uiactivityindicatorview

我目前正在做登录测试,必须重新登录才能登录。按下登录按钮向服务器发送请求后,屏幕上会显示事件指示器,直到事件指示器停止并且事件指示器已停止 下一页,我想再开一个线程用来实现事件指示器,但我不知道如何实现,请帮忙! 而这段代码是从http://www.kaleidosblog.com/how-to-create-a-login-screen-page-in-swift-3-authenticate-an-user-and-keep-the-session-active修改而来的.

    class ViewController: UIViewController {


    let login_url = "http://www.kaleidosblog.com/tutorial/login/api/Login"
    let checksession_url = "http://www.kaleidosblog.com/tutorial/login/api/CheckSession"


    @IBOutlet var username_input: UITextField!
    @IBOutlet var password_input: UITextField!
    @IBOutlet var login_button: UIButton!

    var login_session:String = ""

    var activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)

    override func viewDidLoad() {
        super.viewDidLoad()


        username_input.text = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fa8e8883ba979fd4999597" rel="noreferrer noopener nofollow">[email protected]</a>"
        password_input.text = "test"

        activityIndicator.hidesWhenStopped = true;
        activityIndicator.activityIndicatorViewStyle  = UIActivityIndicatorViewStyle.gray;
        activityIndicator.center = view.center;


        let preferences = UserDefaults.standard
        if preferences.object(forKey: "session") != nil
        {
            login_session = preferences.object(forKey: "session") as! String
            check_session()
        }



    }

    @IBAction func DoLogin(_ sender: AnyObject) {

        login_now(username:username_input.text!, password: password_input.text!)
    }

    @IBAction func backToMain(_ segue:UIStoryboardSegue){
        let preferences = UserDefaults.standard
        preferences.removeObject(forKey: "session")
        self.dismiss(animated: true, completion: nil)

    }


    func login_now(username:String, password:String)
    {
        let post_data: NSDictionary = NSMutableDictionary()


        post_data.setValue(username, forKey: "username")
        post_data.setValue(password, forKey: "password")

        let url:URL = URL(string: login_url)!
        let session = URLSession.shared

        let request = NSMutableURLRequest(url: url)
        request.httpMethod = "POST"
        request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

        var paramString = ""


        for (key, value) in post_data
        {
            paramString = paramString + (key as! String) + "=" + (value as! String) + "&"
        }

        request.httpBody = paramString.data(using: String.Encoding.utf8)

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

            guard let _:Data = data, let _:URLResponse = response  , error == nil else {

                return
            }

            let json: Any?

            do
            {
                json = try JSONSerialization.jsonObject(with: data!, options: [])
            }
            catch
            {
                return
            }

            guard let server_response = json as? NSDictionary else
            {
                return
            }


            if let data_block = server_response["data"] as? NSDictionary
            {
                if let session_data = data_block["session"] as? String
                {
                    self.login_session = session_data

                    let preferences = UserDefaults.standard
                    preferences.set(session_data, forKey: "session")
                    DispatchQueue.main.async {
                        self.view.addSubview(self.activityIndicator)
                    }

                }
            }
        })

        task.resume()
        LoginDone()


    }

    func check_session()
    {
        let post_data: NSDictionary = NSMutableDictionary()


        post_data.setValue(login_session, forKey: "session")

        let url:URL = URL(string: checksession_url)!
        let session = URLSession.shared

        let request = NSMutableURLRequest(url: url)
        request.httpMethod = "POST"
        request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

        var paramString = ""


        for (key, value) in post_data
        {
            paramString = paramString + (key as! String) + "=" + (value as! String) + "&"
        }

        request.httpBody = paramString.data(using: String.Encoding.utf8)

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

            guard let _:Data = data, let _:URLResponse = response  , error == nil else {

                return
            }


            let json: Any?

            do
            {
                json = try JSONSerialization.jsonObject(with: data!, options: [])
            }
            catch
            {
                return
            }

            guard let server_response = json as? NSDictionary else
            {
                return
            }

            if let response_code = server_response["response_code"] as? Int
            {
                if(response_code == 200)
                {
                    DispatchQueue.main.async {
                        self.view.addSubview(self.activityIndicator)
                    }
                }
                else
                {

                }
            }



        })

        task.resume()
    }

    func LoginDone()
    {
        self.performSegue(withIdentifier: "gotomenu", sender: nil)
    }


    func startActivityIndicator(){
        activityIndicator.startAnimating()
    }

    func stopActivityIndicator() {
        activityIndicator.stopAnimating()
    }


}

最佳答案

尝试使用SVProgressHUD。这是我见过的最简单的框架。 SVProgressHUD on GitHub

安装:

在你的 podfile 中:

pod 'SVProgressHUD'

然后在终端中:

pod install

使用方法:

import SVProgressHUD

开始:

SVProgressHUD.show()

解雇:

SVProgressHUD.dismiss()

它非常简单且有用。试试吧。

希望对你有帮助

关于ios - 带事件指示器的登录功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43796921/

相关文章:

php - Swift - 来自 PHP 的推送通知

ios - NSURLConnection(initWithRequest 与 sendAsyncRequest)

ios - 如何将纹理传递给顶点着色器? (iOS 和 Metal )(IOAF 代码 5)

iphone - 给定一个 CGPath,如何让它弯曲?

swift - 如何使用 swift 引用文本字段?

iOS Swift 错误 : Execution was interrupted, 原因:信号 SIGABRT

javascript - 为什么生成器中的console.logs按这样的顺序出现?

javascript - Node.js 循环异步调用

iphone - 确定 iOS 设备上可能的最大同时触摸数?

ios - 尝试在 Swift 中使用来自 CKRecord 的原始数据形式