2016-08-17 72 views
0

我对swift编程颇为陌生。我了解到NSURLSession使用异步通信从url获取响应。我怎么可能显示加载状态,直到请求完成,我得到的答复。例如,如果我从文本字段提交NSurlsession的值,并且必须显示另一个包含来自httprequest的响应的文本字段。当我点击提交按钮时,我应该显示一个laoding状态,直到我得到响应,以便用户知道某个过程正在进行,如“加载,请稍候!!”。我们可以在android asyncTask中显示加载状态,直到我们在使用HTTP Post请求时得到响应为止

另外我们如何使用处理程序来知道我们得到了回应。同样,我会因此无法返回零值

这是现在我的功能

{

类FUNC postURL(VAR postString:字符串,VAR postLink:字符串) - > NSDictionary的

{ 

    let link = postLink 

    let request = NSMutableURLRequest(URL: NSURL(string:link)!) 

    request.HTTPMethod = "POST" 

    let values = postString 


    request.HTTPBody = values.dataUsingEncoding(NSUTF8StringEncoding) 

    var dictionaryVal:NSDictionary! 

    var semaphore = dispatch_semaphore_create(0) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
    { data, response, error in 
     guard error == nil && data != nil else 
     { 
      print("error=\(error)") 
      return 
     } 

     if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 { 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(response)") 
     } 

     var responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     do{ 
      print(">>>",responseString!) 
      var dataExample : NSData = (responseString!.dataUsingEncoding(NSUTF8StringEncoding))! 
      dictionaryVal = try NSJSONSerialization.JSONObjectWithData(dataExample, options:.MutableLeaves) as? NSDictionary 
     } 
     catch 
     { 
      responseString = nil 
      print("Error") 
     } 
     dispatch_semaphore_signal(semaphore) 
    } 
    task.resume() 
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
    return dictionaryVal! 

} 
+0

我觉得奇怪的是,你已经实现了NSURLSession的响应处理,但不明白,当你收到的响应如何知道...处理程序执行时,你有反应... – Fonix

+0

我把来自net的代码..我并没有理解 –

+1

这个逻辑啊,在这种情况下,附加到'NSURLSession.sharedSession()。dataTaskWithRequest(request)'的大括号内的所有内容都会在web服务返回时执行一个响应,所以在那里你会把文本放在你的文本字段中,并停止加载指标等 – Fonix

回答

1

您可以使用UIActivityIndicatorView来显示以下功能中使用的过程指示器。您也可以在启动时禁用UserInteraction并在响应后启用。

func APICall() 
{ 
    var sessionConfiguration:NSURLSessionConfiguration! 
    var session:NSURLSession! 

    // *** create IBOutlet of it and connect with indicator *** 
    let indicator = UIActivityIndicatorView() 

    // *** Hide indicator when stop animating *** 
    indicator.hidesWhenStopped = true 

    sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    sessionConfiguration.timeoutIntervalForResource = 60 
    sessionConfiguration.timeoutIntervalForResource = 120 
    sessionConfiguration.requestCachePolicy = .ReloadIgnoringLocalAndRemoteCacheData 

    session = NSURLSession(configuration: sessionConfiguration) 

    let requestURLString = "http://Your API URL" 
    let request:NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: requestURLString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!)!) 

    // *** start indicator before sending request *** 
    indicator.startAnimating() 
    let task = session.dataTaskWithRequest(request) { (data, response, error) in 

     // *** hide indicator on response on Main Thread *** 
     dispatch_async(dispatch_get_main_queue(), { 
      indicator.stopAnimating() 
     }) 

     if let httpResponse = response as? NSHTTPURLResponse { 
      switch httpResponse.statusCode 
      { 
      case 200: 

       print("Successful response.") 

      default: 
       print("Error :\(error?.localizedDescription)") 
      } 
     } 
    } 

    task.resume() 
} 
+0

我会尝试它出.. ..非常感谢兄弟 –

+0

@ Jeesson_7随时欢迎。快乐编码;) –

0

是的,因为你必须使用NSURLSessionDownloadDelegate和它的方法:

this is the screen of system code

相关问题