我的应用需要在加载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
答案 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()
}