我的ViewController中有一个UITableView。要填充它,我必须提出一个async
请求,可能需要一秒钟才能完成。我应该把它放在哪里?
当我尝试使ViewDidLoad
异步并从那里进行调用时,ViewWillLayoutSubviews
会抛出错误,因为它会尝试定位一些尚未分配的元素 - 因为事实并非如此来自ViewDidLoad
的所有代码都已执行(我认为)。
答案 0 :(得分:2)
等待ViewDidLoad
中的任何内容之前,您需要设置所有视图逻辑。否则,ViewDidLoad
方法返回时,视图初始化将不会完成。这可能是ViewWillLayoutSubviews
失败的潜在原因。如果仍然失败,请使用try / catch确保您的服务正常运行:
public override async void ViewDidLoad()
{
base.ViewDidLoad();
// setup all the view elements here (before the async call)
try
{
var results = await MakeYourAsyncRequest();
InvokeOnMainThread(() =>
{
_tableView.Source = ...; // do something with the results
_tableView.ReloadData();
});
}
catch(Exception ex)
{
// do something with the exception
}
}
答案 1 :(得分:0)
尝试将 tableView.ReloadData(); 方法放在
中dispatch_async(dispatch_get_main_queue(),^ {} 这可能会解决您的问题。
- :作为一般规则,您应该尝试确保所有UI交互都发生在主线程上。您的数据提取任务将在后台运行。看起来你正在调用你的重装数据 背景线程,似乎有风险。
答案 2 :(得分:0)
根据数据,我会将呼叫置于 router.post('/data_find', function (req, res) {
var database = req.Collection;
var start_date = req.body.start_date;
var end_date = req.body.end_date;
if (start_date.length > 0 && end_date.length > 0) {
database.find({ "item_blocked_on.start_date": {$gte: start_date}, "item_blocked_on.end_date": {$lt: end_date},function(err,user){
if (err) {
res.json({status: 0, message: err});
}
if (!user) {
res.json({status: 0, msg: "not found"});
}
res.json({status: 1, id: user._id, message: " success"});
})
} else {
res.json({status: 0, msg: "Invalid Fields"});
}
});
。当应用程序启动时,应该提取并保存数据。
当您的AppDelegate
出现时,它已经准备好数据或者可能是错误消息,因为您已经知道了获取的结果。
数据可能会改变这一点,这也是为什么我还要将UITableview
的{{1}}中的抓取电话与viewWillAppear()
放在一起。
ViewController
是一种只被调用一次的方法。它也被称为ViewController生命周期的第一个方法。
如果你仔细阅读它VC lifecycle会很好。
您可以使用UITableview