异步调用后无法刷新UI

阿尔法罗

我想做什么:我有一个登录屏幕,用户输入用户名和密码,然后按登录按钮。已完成对服务器的异步调用,以检查用户是否已注册并且密码是否正确,如果是(异步功能将bool设置为yes),则对下一个视图控制器进行选择。如此简单,我尝试了许多方法,但始终有相同的问题,主线程运行shouldPerformSegueWithIdentifier方法,请执行异步调用并在后台线程更新全局bool var(默认为false)之前对其进行检查,因此不会执行segue,因为全局变量设置为true AFTER。仅当我使用sleep(1)时,UI才会刷新,但我不想使用它。有没有办法做到这一点不睡觉?我运行的每个方法都有一个完成处理程序。我不知道如何将主线程与后台线程同步。我已经读过从异步调用更新UI的可能,所以这应该是可能的。我寻找问题已有一段时间了,尝试了很多片段,但仍然没有找到解决我问题的方法。这是我到目前为止的代码:

    override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool {

    let apiCall = webApi()

    dispatch_async(dispatch_get_main_queue()) {

        apiCall.callCheckIsUserLogged(nil, password : self.passwordField.text, email: self.mailField.text){ (ok) in
        }
    }
//sleep(1) if I uncomment this, my method works because it will return true
    return userIsLogged
}

apiCall.callCheckIsUserLogged()

typealias successClosure = (success : Bool) -> Void
    //Make a call to check if the user exist, server returns json with success or failure
func callCheckIsUserLogged(username: String?, password : String?, email: String?,completed : successClosure){

    userApiCallUrl = "http://apiurl.com/users/login"

    let call = asyncCallClass()
    call.doAsyncCallWithParams(userApiCallUrl, calltype: "POST", username: username, pass: password, mail: email){ (success) in
        completed(success: true)
    }

}

call.doAsyncCallWithParams() 代码:

internal typealias completion = (success : Bool) -> Void
private var flagCompletion : Bool = false

        //Handle async class with this method
//var callType is aditioned everytime an arg is not passed nil.
//callType == 3 it is a call to check if user is logged
//callType == 2 is a call to register a new user
func doAsyncCallWithParams(url : String, calltype : String, username : String?, pass : String?, mail : String?, completed : completion){

    var callType : Int = 0


    //Set Async Url
    setUrl(url)

    //Set Post Params
    if let user : String = username{
        self.username = "username=\(user)"
        callType += 1
    }
    if let password : String = pass{
        self.password = "password=\(password)"
        callType += 1
    }
    if let mail : String = mail{
        self.email = "email=\(mail)"
        callType += 1
    }

    //register a new user
    if(callType == 3){
        paramString = "\(self.username)&\(self.password)&\(self.email)"

    }
    //check if user is logged, send email and password
    if(callType == 2){
        paramString = "\(self.email)&\(self.password)"
    }

    //Do call
    callWithCompletionHandler { (success) in
        self.flagCompletion = true
        completed(success: self.flagCompletion)
    }
}

callWithCompletionHandler() 代码:

private typealias completionAsyncCall = (success : Bool) -> Void
    private func callWithCompletionHandler(completed : completionAsyncCall){
        asyncJson.removeAllObjects()

        //Set async call params
        let request = NSMutableURLRequest(URL: NSURL(string: self.url!)!)
        request.HTTPMethod = "POST"
        let trimmedPostParam : String = self.paramString!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

        request.HTTPBody = trimmedPostParam.dataUsingEncoding(NSUTF8StringEncoding)

        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
            guard error == nil && data != nil else {
                // check for fundamental networking error
                print("error=\(error)")
                return
            }
            if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 {
                // check for http errors
                print("statusCode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(response)")
            }

            let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)


            let result : AnyObject = responseString!.parseJSONString!

                if let nsMutableResult = result as? NSMutableArray{
                    print("NSMutableArray")
                }
                if let nsDictResult = result as? NSMutableDictionary{
                    self.parseMutableDictionary(nsDictResult)
                }


            self.flag = true  // true if download succeed,false otherwise
            completed(success: flagAsyncCall!)
        }
        task.resume()
    }
托巴洛夫洛维奇

在登录按钮上按通话:

apiCall.callCheckIsUserLogged(nil, password : self.passwordField.text, email: self.mailField.text){ (ok) in
  if ok {
     self.performSegueWithIdentifier("Identifier", sender: self)
  } else {
    print("User not logged in")
   }
}

因为callCheckIsUserLogged无论用户是否登录,您的方法已经返回。

internal typealias completion = (success : Bool) -> Void

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多次异步调用后回调?

来自分类Dev

异步调用后DOM更新

来自分类Dev

完成多个异步调用后,AJAX会启动最终的异步调用

来自分类Dev

异步调用后cudaFree是否起作用?

来自分类Dev

异步调用后如何自动对焦选择输入?

来自分类Dev

异步调用后cudaFree是否起作用?

来自分类Dev

Angular 4 - 在异步调用后显示消息

来自分类Dev

React Context API 在异步调用后不更新状态

来自分类Dev

试图了解UI异步调用

来自分类Dev

无法等待异步调用中的对象

来自分类Dev

使用Angular在完成一堆异步调用后如何进行调用

来自分类Dev

异步调用后,JavaScript ES6调用为“ super”

来自分类Dev

Angular-异步调用后端后正确的过程调用方法

来自分类Dev

异步调用方法

来自分类Dev

角度异步调用

来自分类Dev

与委托的异步调用

来自分类Dev

OnContextItemSelected异步调用

来自分类Dev

承诺异步调用

来自分类Dev

angular.js ui +引导程序提前+异步调用

来自分类Dev

使用react-router成功进行异步调用后如何重定向?

来自分类Dev

Azure Webjob中的异步调用后TextWriter意外关闭

来自分类Dev

Angularfire-异步调用后$ scope不会更新,并且$ apply引发错误

来自分类Dev

Android的科特林:如何异步调用后更新recyclerView?越来越CalledFromWrongThreadException

来自分类Dev

在React中异步调用后如何测试状态更新和组件重新呈现

来自分类Dev

NGXS如何在异步调用后触发Angular重新渲染?

来自分类Dev

CompletableFuture:异步调用后,在当前线程中处理结果

来自分类Dev

WSO2 企业集成商序列 - 异步调用后的轮询结果

来自分类Dev

从异步调用void同步方法-无法等待void

来自分类Dev

为什么在使用异步调用的 react js 中刷新时不呈现数据?

Related 相关文章

  1. 1

    多次异步调用后回调?

  2. 2

    异步调用后DOM更新

  3. 3

    完成多个异步调用后,AJAX会启动最终的异步调用

  4. 4

    异步调用后cudaFree是否起作用?

  5. 5

    异步调用后如何自动对焦选择输入?

  6. 6

    异步调用后cudaFree是否起作用?

  7. 7

    Angular 4 - 在异步调用后显示消息

  8. 8

    React Context API 在异步调用后不更新状态

  9. 9

    试图了解UI异步调用

  10. 10

    无法等待异步调用中的对象

  11. 11

    使用Angular在完成一堆异步调用后如何进行调用

  12. 12

    异步调用后,JavaScript ES6调用为“ super”

  13. 13

    Angular-异步调用后端后正确的过程调用方法

  14. 14

    异步调用方法

  15. 15

    角度异步调用

  16. 16

    与委托的异步调用

  17. 17

    OnContextItemSelected异步调用

  18. 18

    承诺异步调用

  19. 19

    angular.js ui +引导程序提前+异步调用

  20. 20

    使用react-router成功进行异步调用后如何重定向?

  21. 21

    Azure Webjob中的异步调用后TextWriter意外关闭

  22. 22

    Angularfire-异步调用后$ scope不会更新,并且$ apply引发错误

  23. 23

    Android的科特林:如何异步调用后更新recyclerView?越来越CalledFromWrongThreadException

  24. 24

    在React中异步调用后如何测试状态更新和组件重新呈现

  25. 25

    NGXS如何在异步调用后触发Angular重新渲染?

  26. 26

    CompletableFuture:异步调用后,在当前线程中处理结果

  27. 27

    WSO2 企业集成商序列 - 异步调用后的轮询结果

  28. 28

    从异步调用void同步方法-无法等待void

  29. 29

    为什么在使用异步调用的 react js 中刷新时不呈现数据?

热门标签

归档