ios - 在我的项目中使用 API 调用时如何使用自定义事件指示器 View

标签 ios swift api

我是 Stack Overflow 的新手,正在学习 Swift,现在正在做一个 API 调用的项目。

我想使用自定义事件指示器 View ,直到从 API 获取数据。因此,请帮助我解决代码中的问题。 我已经导入JTMaterialSpinner我的项目中的库。

这是我想要显示的微调器(自定义事件指示器 View ):

enter image description here

这是我的代码:

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/

相关文章:

ios - Firebase 和 Swift 3 异步单元测试

ios - 是否可以将委托(delegate)附加到 FBSDKShareButton 呈现的 FBSDKShareDialog?

swift - _ : vs _ String: when writing functions 的区别/用例是什么

java - CoreData 和 Hibernate 的区别

ios - 对 Geolocation iOS 应用程序进行负载测试的方法

ios - Mach-O 链接器错误 Xcode 5

javascript - 从 Web api 获取数据时出现问题

ios - MPMoviePlayerViewController 不播放

api - Powershell Invoke-RestMethod

api - 是否可以通过服务器端API将事件发布到Google Analytics(分析)?