【问题标题】:Pull Refresh with Alamofire Swift 4使用 Alamofire Swift 4 拉取刷新
【发布时间】:2018-12-16 22:22:50
【问题描述】:

在我的应用程序中,我正在使用 Alamofire 实现拉取刷新,它正在刷新但不幸的是没有带回任何数据。我究竟做错了什么?我肯定错过了一些东西。

这里是代码

我的班级地震列表

var earthquake: Earthquake?
var refresh = UIRefreshControl()

viewDidLoad()

// Refresh Control
    //let refreshControl = UIRefreshControl()
    refresh.tintColor = UIColor.yellow
    refresh.addTarget(self, action: #selector(refreshData), for: UIControlEvents.valueChanged)

    if #available(iOS 10.0, *) {
        self.tableView.refreshControl = (self.refresh)
    } else {
        self.tableView.addSubview(self.refresh)
    }

viewDidLoad() 上的 Alamofire

Alamofire.request("http://www.seismicportal.eu/fdsnws/event/1/query?limit=50&format=json").responseJSON { response in
        //print("Request: \(String(describing: response.request))")   // original url


        if let data = response.data{
            do {

                self.earthquake = try
                    JSONDecoder().decode(Earthquake.self, from: data)
                print("features data: \(String(describing: self.earthquake?.features))")
                // print("data: \(self.features.count)")
                self.tableView.reloadData()
                self.refresh.endRefreshing()
            }
            catch{}
        }
    }
}

和objc的函数

@objc func refreshData() {
    self.tableView.reloadData()
    self.refresh.endRefreshing()
}

【问题讨论】:

  • refreshData() 不执行新的 Alamofire 请求。那是正常的。
  • 您所做的只是在 tableView 上调用reloadData。您实际上并未尝试通过 API 加载任何新数据。使用 Alamofire 发出请求,完成后重新加载 tableView
  • 只需在 refreshData() 函数中添加 Alamofire.request 方法并在 viewDidLoad() 中调用即可。
  • 创建 1 个方法并将 API 调用代码从 viewDidLoad 移动到此方法内部,并在 viewDidLoadrefreshData 方法中调用该方法,目前您只是重新加载 tableview。
  • 谢谢大家的帮助……我会为可能有同样问题的人更新代码

标签: ios swift xcode alamofire get-request


【解决方案1】:

在函数中添加您的 Alamofire 请求并在 refreshData() 中调用它。第一次加载数据时,您可以在 viewDidLoad() 中调用该函数(包含 Alamofire 请求)。

func myRequest() {
    // Alamofire request goest here.....

    /* Inside of Alamofire callback block */
       // Assign data to data source
       self.tableView.reloadData()
       if (self?.refresh.isRefreshing)! {
          self.refresh.endRefreshing()
       }
    /*--------*/
}

override func viewDidLoad() {
    super.viewDidLoad()
    myRequest()
}

@objc func refreshData() {
    myRequest()
}

【讨论】:

    【解决方案2】:

    使用以下代码更新您的方法:

    @objc func refreshData() {
        // start refresh control
        self.refresh.beginRefreshing()
    
        // get data from server
        Alamofire.request("http://www.seismicportal.eu/fdsnws/event/1/query?limit=50&format=json").responseJSON { response in
            if let data = response.data {
                do {
                    self.earthquake = try JSONDecoder().decode(Earthquake.self, from: data)
    
                    // End refreshing and reload table
                    self.refresh.endRefreshing()
                    self.tableView.reloadData()
                }
                catch{}
            }
        }
    }
    

    【讨论】:

    • 我认为 OP 在 6 分钟前找到了解决方案。
    • 我们不需要调用self.refresh.beginRefreshing(),因为它是在用户拉动tableview时调用的
    • @SubhajitHalder 我知道。第一次,将从 viewDidLoad 调用此方法,因此这将在表格视图上显示活动指示器。如果要以编程方式触发代码,这会很有帮助。
    • @Kalpesh 我理解你的意思,但是以编程方式调用self.refresh.beginRefreshing() 不会显示刷新控件,我们也需要添加这一行来显示tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentOffset.y - (refreshControl.frame.size.height)), animated: true),如果我们在@987654325 中调用它@可能有一些问题
    • @SubhajitHalder,如果我们在API调用的开头写这行self.refresh.beginRefreshing()没有问题,不需要设置tableViewcontentOffSet
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多