Swift如何dispatch_queue来更新tableview单元格

时间:2016-05-21 15:33:48

标签: swift dispatch-async

我的应用需要在加载tableview之前从服务器获取数据。 如何使用dispatch_async在完成提取数据后使应用程序更新单元格视图。

  # Safe to set globally, since actions can either render or redirect once or fail anyway
  before do
    allow(controller).to receive(:render).and_call_original
  end

  describe "get left panel" do
    before do
      # other setup
      get 'left_panel'
    end

    it 'should render correct template for lelf_panel' do
      # Sadly, render_template is primitive (no hash_including, no block with args, etc.)
      expect(subject).to render_template('system/_left_panel')
    end

    it 'should render with correct local value' do
      expect(controller).to have_received(:render) do |options|
        expect(options[:locals][:key_from_very_long_hash]).to eq('value_of_key_from_very_long_hash')
      end
    end
  end

当我习惯上面的代码时,它给出了一个错误:dictAnswer是零。 dictAnswer从服务器获取。我认为原因是在dictAnswer获取之前更新了单元格。但我不知道如何使用dispatch_async。我希望有一些可以给我一个暗示。 THX

3 个答案:

答案 0 :(得分:6)

您的UITableViewDataSource函数应该引用数组中的行数,如此

var data:[String]()

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    }

因此,在您的异步函数中获取您可能执行的数据:

func loadData() {
     // some code to get remote data
     self.data = result
     dispatch_async(dispatch_get_main_queue()) {
         tableView.reloadData()
     }
}

当你的数组为空时,(data.count返回0)tableView不会尝试加载任何行并崩溃

Swift 3 +的更新:

DispatchQueue.main.async {
    tableView.reloadData()
}

答案 1 :(得分:4)

这是您重新加载数据的方式。但请记住在您之前刷新阵列 重新加载数据。请记住,仅提取数据并不重要,在重新加载之前将数据更新到数组中也很重要

dispatch_async(dispatch_get_main_queue(), {() -> Void in
            self.tableView.reloadData()
        })

答案 2 :(得分:0)

使用Scriptable的答案后,我不得不做一些更新,并认为将它们发回这里是个好主意......

Swift 3

DispatchQueue.main.async(execute: { () -> Void in
                    self.tableView.reloadData()
                })

DispatchQueue.main.async {
    self.tableView.reloadData()
}