Xamarin.ios MVVMCross-更新UITableView源

Xamarin.ios MVVMCross-更新UITableView源,xamarin.ios,xamarin,mvvmcross,Xamarin.ios,Xamarin,Mvvmcross,我有一个列表,它在加载时绑定到一个视图,可以正常工作。我还有一个计时器,它调用一个服务来检查要添加到列表中的任何新项目。当我尝试向列表中添加新项目时,出现了一个错误,需要在UI线程上执行该操作 我正在尝试将项目添加到ObservableCollection,如下所示: private ObservableCollection<ChatMessageViewModel> _items; public MyViewModel(IMvxMessenger messenger, IMySe

我有一个列表,它在加载时绑定到一个视图,可以正常工作。我还有一个计时器,它调用一个服务来检查要添加到列表中的任何新项目。当我尝试向列表中添加新项目时,出现了一个错误,需要在UI线程上执行该操作

我正在尝试将项目添加到ObservableCollection,如下所示:

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)