我是 Stack Overflow 的新手,正在学习 Swift,现在正在做一个 API 调用的项目。
我想使用自定义事件指示器 View ,直到从 API 获取数据。因此,请帮助我解决代码中的问题。
我已经导入JTMaterialSpinner
我的项目中的库。
这是我想要显示的微调器(自定义事件指示器 View ):
这是我的代码:
var spinerrview : JTMaterialSpinner = JTMaterialSpinner(frame: CGRectZero)
override func viewDidLoad()
{
super.viewDidLoad()
spinerrview.circleLayer.strokeColor = UIColor.greenColor().CGColor spinerrview.circleLayer.lineWidth=2.0
spinerrview.frame.size.height=25.0
spinerrview.frame.size.width=25.0
spinerrview.circleLayer
spinerrview.isAnimating=true
spinerrview.backgroundColor=UIColor.greenColor()
spinerrview.beginRefreshing()
getdata()
spinerrview.endRefreshing()
}
我给出了完整的代码
import UIKit
import Alamofire
import SwiftyJSON
import JTMaterialSpinner
class ViewController: UIViewController ,UITextViewDelegate,UITableViewDataSource{
var arrRes = [[String:AnyObject]]()
var spinerrview : JTMaterialSpinner = JTMaterialSpinner(frame: CGRectZero)
@IBOutlet weak var table: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
spinerrview.circleLayer.strokeColor = UIColor.redColor().CGColor
spinerrview.circleLayer.lineWidth=3.0
spinerrview.circleLayer
spinerrview.isAnimating=true
spinerrview.frame.size.height=25.0
spinerrview.frame.size.width = 25.0
spinerrview.center=table.center
spinerrview.beginRefreshing()
getdata(NSURL(string: "http:api.androidhive.info/contacts/")!, completionHandler: { (success) -> Void in
// When your API call was terminated, control flow goes here.
self.spinerrview.endRefreshing()
if success {
print("success")
} else {
print("fail")
}
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
typealias CompletionHandler = (success:Bool) -> Void
func getdata(url: NSURL,completionHandler: CompletionHandler) {
Alamofire.request(.GET, url).validate().responseJSON { response in
var flag = false // true if call is succeed,false otherwise
switch response.result {
case .Success(let data):
flag=true
let swiftyJsonVar = JSON(data)
if let resData = swiftyJsonVar["contacts"].arrayObject {
self.arrRes = resData as! [[String:AnyObject]]
}
self.table.reloadData()
case .Failure(let error):
flag=false
print("Request failed with error: \(error)")
}
completionHandler(success: flag )
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("jsonCell")!as! TableViewCell
var dict = arrRes[indexPath.row]
cell.name.text = dict["name"] as? String
return cell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arrRes.count
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
performSegueWithIdentifier("gotoview", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "gotoview") {
let indexPat = self.table.indexPathForSelectedRow!
let vc = segue.destinationViewController as! secondViewController
vc.adde = "add "+(arrRes[indexPat.row]["address"] as? String)!
vc.mail = "mail "+(arrRes[indexPat.row]["email"] as? String)!
vc.iid = "id "+(arrRes[indexPat.row]["id"] as? String)!
vc.nam = (arrRes[indexPat.row]["name"] as? String)!
vc.ph = "phone "+(arrRes[indexPat.row]["phone"]!["mobile"]as? String)!
}
}
}
最佳答案
您的问题在于以下三行:
spinerrview.beginRefreshing()
getdata()
spinerrview.endRefreshing()
微调器在主线程中启动,启动 getdata() ,它可能在后台线程中进行一些工作,因此您不知道它何时完成,并且微调器在调用 getdata 后立即结束。就像在现实生活中立即按下灯光按钮开/关一样。
为了避免此类问题,您可以为 getdata() 函数(API 调用)创建一个completionHandler:
typealias CompletionHandler = (success:Bool) -> Void
func getdata(url: NSURL,completionHandler: CompletionHandler) {
// API call code.
let flag = true // true if call is succeed,false otherwise
completionHandler(success: flag)
}
用法:
spinerrview.beginRefreshing()
getdata(NSURL(string: "http://...")!, { (success) -> Void in
// When your API call was terminated, control flow goes here.
spinerrview.endRefreshing()
if success {
// API call success
} else {
// API call fail
}
})
<小时/>
更新: (在新编辑后添加 getdata())
typealias CompletionHandler = (success:Bool) -> Void
func getdata(url: NSURL,completionHandler: CompletionHandler) {
Alamofire.request(.GET, url).validate().responseJSON { response in
var flag = false // true if call is succeed,false otherwise
switch response.result {
case .Success(let data):
flag=true
let swiftyJsonVar = JSON(data)
if let resData = swiftyJsonVar["contacts"].arrayObject {
self.arrRes = resData as! [[String:AnyObject]]
}
self.table.reloadData()
case .Failure(let error):
flag=false
print("Request failed with error: \(error)")
}
completionHandler(success: flag )
}
}
关于ios - 在我的项目中使用 API 调用时如何使用自定义事件指示器 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38123767/