0

我的屏幕上有一个 Xamarin 表单地图,我正在使用 PropertyChanged 事件从我的服务器检索地理位置信息并在屏幕上显示正确的图钉。

在编写解决方案时,我注意到 PropertyChanged 事件通过地图上的一次缩放或拖动操作多次触发(最多 10 次)。这会导致对服务器的不必要调用,这是我想避免的。

理想情况下,我只想在调用最终的 PropertyChanged 事件时对服务器进行一次调用,但我找不到一个简单的解决方案来实现这一点。

此时,我在页面中添加了一个刷新按钮,该按钮在 PropertyChanged 事件发生时启用,并在用户使用该按钮后禁用它。

显然,这修复了对服务器的过多调用,但使解决方案成为手册。我想知道是否有一种更优雅的方式来进行服务器调用但自动进行。

提前致谢。

4

1 回答 1

0

我只是PropertyChanged在 iOS 端测试了这个事件,它只是在地图上通过一次缩放或拖动操作触发了一次。

而如果它真的触发了多次,您可以在调用最终PropertyChanged事件时使用计时器来调用服务器,例如:

public partial class MapPage : ContentPage
{
    Timer aTimer;
    public MapPage()
    {
        InitializeComponent();

        customMap.PropertyChanged += CustomMap_PropertyChanged;
    }

    private void CustomMap_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {

        if (aTimer != null)
        {
            aTimer.Enabled = false;
            aTimer.Stop();
            aTimer.Close();
        }

        aTimer = new Timer();
        aTimer.Interval = 1000;
        aTimer.Enabled = true;
        aTimer.Elapsed += ATimer_Elapsed;
        aTimer.Start();
    }

    private void ATimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        aTimer.Stop();

        //do web request
        Console.WriteLine(sender);
        Console.WriteLine("CustomMap_PropertyChanged");
    }
}

在上面的代码中,我设置了 Interval = 1 秒,即在 1 秒内,无论触发多少次PropertyChanged,只有最后一次调用会触发该ATimer_Elapsed函数。

根据您的要求,可以将间隔设置为任何值。

于 2019-09-05T06:11:30.040 回答