.Net-8.0 MAUI Blazor 应用程序上的异步调用不适用于 iOS 平台,适用于 Android 和 Windows

问题描述 投票:0回答:1

在 .NET 中创建应用程序 (8) MAUI BLAZOR HYBRID

该作品在 Android、Windows 和 iOS 上初始化。但是,数据仅在 Windows 和 Android 上检索和显示。 iOS平台不获取数据。它显示没有数据的页面并且不会重新加载它(显然无论如何都不会获取数据)。我设置了一个断点,它没有执行或到达以下代码行:

SharedData.SharedDataBundle = Global.DataBundleCollelction;

问题

观察结果是,下面的异步调用在 iOS 平台上不受尊重。 Windows 和 Android 会等待异步调用完成并继续处理数据。

不知道如何修复它,我尝试了很多调用它的方法,但 async-await Task.Run() 或 Task.WhenAll() 似乎不适用于 iOS。

启动代码

App.Xaml.cs中的代码如下:

    public partial class App : Application
    {
        [Inject] SharedDataService sharedDataService { get; set; }

        public App()
        {
            InitializeComponent();
            sharedDataService = new SharedDataService();
            
            var tasks = new List<Task>
            {
                Task.Run(async () =>
                {
                    Global.DataBundleCollelction = await sharedDataService.UpdateSharedWeatherData(new List<int> { 1, 2, 4, 25, 26, 91 });
                    SharedData.SharedDataBundle = Global.DataBundleCollelction;
                }),
                Task.Run(async () =>
                {
                    var bundle = Global.DataBundleCollelction;
                    var weatherSettingsService = new WeatherSettingsService(bundle);
                    var weatherSettings = await weatherSettingsService.LoadSettingsAsync();
                })
            };

            Task.WhenAll(tasks).Wait();
            MainPage = new MainPage();
        }
    }

请指导我我错过了什么?

更新:

我使用以下方法从 /Resources/Raw/MyJson.json (MauiAsset) 读取 JSON 文件

public async Task<ObservableCollection<T>> ReadJsonDataAsync<T>(string jsonDataFileName)
{
    ObservableCollection<T>? genericTypeList = new();
    var isExist = await FileSystem.AppPackageFileExistsAsync(jsonDataFileName);
    if (isExist)
    {
        var stream = await FileSystem.Current.OpenAppPackageFileAsync(jsonDataFileName);
        var reader = new StreamReader(stream);
        var contents = await reader.ReadToEndAsync();
        genericTypeList = JsonSerializer.Deserialize<ObservableCollection<T>>(contents);
    }
    return genericTypeList!;
}

观察/回答

上述函数将 JSON 文件读取为 MauiAsset。该文件路径被指定为“Resources/Raw/MyJsonFile.json” - 该路径适用于 Android 和 Windows,但 iOS 不喜欢它。

现在可以了,(@Alexandar May - MSFT)在下面的评论中分享的链接引导我找到了解决方案。

async-await maui .net-8.0 maui-blazor maui-ios
1个回答
0
投票

这是在 Github 上跟踪的一个已知问题:AppPackageFileExistsAsync 无法在具有 MAUI 资产的链接文件上工作#12635

要修复此问题,您可以在

csproj
文件中编写资产链接,例如:

<MauiAsset Include="..\Resources\MyJsonFile.json">
    <Link Condition=" $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) != 'android' ">Resources\Raw\MyJsonFile.json</Link>
    <Link Condition=" $([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android' ">Raw\MyJsonFile.json</Link>
</MauiAsset>

然后你可以像这样读取文件:

var isExist = await FileSystem.Current.AppPackageFileExistsAsync("Raw/MyJsonFile.json");
© www.soinside.com 2019 - 2024. All rights reserved.