Xamarin.ios MVVMCross-更新UITableView源
我有一个列表,它在加载时绑定到一个视图,可以正常工作。我还有一个计时器,它调用一个服务来检查要添加到列表中的任何新项目。当我尝试向列表中添加新项目时,出现了一个错误,需要在UI线程上执行该操作 我正在尝试将项目添加到ObservableCollection,如下所示:Xamarin.ios MVVMCross-更新UITableView源,xamarin.ios,xamarin,mvvmcross,Xamarin.ios,Xamarin,Mvvmcross,我有一个列表,它在加载时绑定到一个视图,可以正常工作。我还有一个计时器,它调用一个服务来检查要添加到列表中的任何新项目。当我尝试向列表中添加新项目时,出现了一个错误,需要在UI线程上执行该操作 我正在尝试将项目添加到ObservableCollection,如下所示: private ObservableCollection<ChatMessageViewModel> _items; public MyViewModel(IMvxMessenger messenger, IMySe
private ObservableCollection<ChatMessageViewModel> _items;
public MyViewModel(IMvxMessenger messenger, IMyService myService) : base (messenger)
{
_myService = myService;
_timer = new Timer(GetLatestItems,null, 1000,10000);
}
public async void GetLatestItems()
{
var newItems = await _myService.GetNewMessages();
if (newItems != null && newItems.Count > 0)
{
foreach (var item in newItems)
{
Items.Add(item);
}
}
}
private observedcollection\u项目;
公共MyViewModel(IMvxMessenger messenger,IMyService myService):基础(messenger)
{
_myService=myService;
_定时器=新定时器(GetLatestItems,null,100010000);
}
公共异步void GetLatestItems()
{
var newItems=wait_myService.GetNewMessages();
if(newItems!=null&&newItems.Count>0)
{
foreach(newItems中的var项)
{
项目。添加(项目);
}
}
}
ObservableCollection
/INotifyCollectionChanged
必须同步使用-因此必须在UI线程上使用它
Timer
使用线程池线程
要将呼叫重新发送到UI,请尝试以下操作:
public MyViewModel(IMvxMessenger messenger, IMyService myService) : base (messenger)
{
_myService = myService;
_timer = new Timer(GetLatestItems,null, 1000,10000);
}
public async void GetLatestItems()
{
var newItems = await _myService.GetNewMessages();
InvokeOnMainThread(() => {
if (newItems != null && newItems.Count > 0)
{
foreach (var item in newItems)
{
Items.Add(item);
}
}
});
ObservableCollection
/INotifyCollectionChanged
必须同步使用-因此必须在UI线程上使用它
Timer
使用线程池线程
要将呼叫重新发送到UI,请尝试以下操作:
public MyViewModel(IMvxMessenger messenger, IMyService myService) : base (messenger)
{
_myService = myService;
_timer = new Timer(GetLatestItems,null, 1000,10000);
}
public async void GetLatestItems()
{
var newItems = await _myService.GetNewMessages();
InvokeOnMainThread(() => {
if (newItems != null && newItems.Count > 0)
{
foreach (var item in newItems)
{
Items.Add(item);
}
}
});
ObservableCollection
/INotifyCollectionChanged
必须同步使用-因此必须在UI线程上使用它
Timer
使用线程池线程
要将呼叫重新发送到UI,请尝试以下操作:
public MyViewModel(IMvxMessenger messenger, IMyService myService) : base (messenger)
{
_myService = myService;
_timer = new Timer(GetLatestItems,null, 1000,10000);
}
public async void GetLatestItems()
{
var newItems = await _myService.GetNewMessages();
InvokeOnMainThread(() => {
if (newItems != null && newItems.Count > 0)
{
foreach (var item in newItems)
{
Items.Add(item);
}
}
});
ObservableCollection
/INotifyCollectionChanged
必须同步使用-因此必须在UI线程上使用它
Timer
使用线程池线程
要将呼叫重新发送到UI,请尝试以下操作:
public MyViewModel(IMvxMessenger messenger, IMyService myService) : base (messenger)
{
_myService = myService;
_timer = new Timer(GetLatestItems,null, 1000,10000);
}
public async void GetLatestItems()
{
var newItems = await _myService.GetNewMessages();
InvokeOnMainThread(() => {
if (newItems != null && newItems.Count > 0)
{
foreach (var item in newItems)
{
Items.Add(item);
}
}
});
或者在异步/等待的现代世界中:
async void FunkyTimer(){while(true){wait Task.Delay(10000);wait GetLatestItems();}}}
对InvokeOnMainThread
的需求已经消失。(灵感来源于@StephaneDelcroix)+1。。。尽管我会小心处理while(true)
的退出条件,或者在异步/await的现代世界中:async void FunkyTimer(){while(true){await Task.Delay(10000);await GetLatestItems();}}
和InvokeOnMainThread
的需求已经消失。(灵感来源于@StephaneDelcroix)+1。。。尽管我会小心处理while(true)
的退出条件,或者在异步/await的现代世界中:async void FunkyTimer(){while(true){await Task.Delay(10000);await GetLatestItems();}}
和InvokeOnMainThread
的需求已经消失。(灵感来源于@StephaneDelcroix)+1。。。尽管我会小心处理while(true)
的退出条件,或者在异步/await的现代世界中:async void FunkyTimer(){while(true){await Task.Delay(10000);await GetLatestItems();}}
和InvokeOnMainThread
的需求已经消失。(灵感来源于@StephaneDelcroix)+1。。。虽然我会小心while(true)