Xamarin.iOS 的 PCLStorage 问题

PCLStorage problems with Xamarin.iOS

我用 Xamarin 编写了我的应用程序,首先测试了 Android,然后测试了 iOS。在 Android 上一切正常,但在 iOS 上不行。我的问题与 PCLStorage 有关,读取文件内容时失败,因为 GetFileAsync 结果是 null,而不是 CheckExistsAsync 结果。

我的代码是:

public static async Task loadMyFile(Func<bool, Task> result) {
    IFolder rootFolder = FileSystem.Current.LocalStorage;
    await rootFolder.CheckExistsAsync("myfile.txt").ContinueWith(async (checkExistsTask) => {
        if (checkExistsTask.Result == ExistenceCheckResult.FileExists) {
            await rootFolder.GetFileAsync("myfile.txt").ContinueWith(async (getFileTask) => {
                try
                {
                    await getFileTask.Result.ReadAllTextAsync().ContinueWith(async (readTextTask) => {
                        try
                        {
                            if (!string.IsNullOrEmpty(readTextTask.Result))
                            {
                                doWork(readTextTask.Result);
                                await result(true);
                                return;
                            }
                            else
                            {
                                await result(false);
                                return;
                            }
                        }
                        catch (Exception e)
                        {
                            await result(false);
                            return;
                        }
                    });
                }
                catch (Exception e)
                {
                    await result(false);
                    return;
                }
            });
        } else {
            await result(false);
            return;                 
        }
    });
}

有什么想法吗? 谢谢。

我不知道为什么你在等待任务时在这里使用 ContinueWith

我可能会这样写代码:

public static async Task loadMyFile(Func<bool, Task> result) 
{
    IFolder rootFolder = FileSystem.Current.LocalStorage;
    var exists = await rootFolder.CheckExistsAsync("myfile.txt");
    if (exists == ExistenceCheckResult.FileExists) 
    {
        var file = await rootFolder.GetFileAsync("myfile.txt");
        try
        {
            var text = await file.ReadAllTextAsync();
            if (!string.IsNullOrEmpty(text))
            {
                doWork(text);
                await result(true);
                return;
            }
            else
            {
                await result(false);
                return;
            }
        }
        catch (Exception e)
        {
            await result(false);
            return;
        }
    } else {
        await result(false);
        return;                 
    }
}

这样读起来容易多了,你去掉了不必要的 try/catch。

您可能希望将 ConfigureAwait(false) 添加到您的任务中,这样您就不会进行太多的上下文切换。

您可以通过摆脱回调并仅 return 作为任务结果的 bool 来大大简化您的方法:

public static async Task<bool> loadMyFile() 
{
    IFolder rootFolder = FileSystem.Current.LocalStorage;
    var exists = await rootFolder.CheckExistsAsync("myfile.txt");
    if (exists == ExistenceCheckResult.FileExists) 
    {
        var file = await rootFolder.GetFileAsync("myfile.txt");
        try
        {
            var text = await file.ReadAllTextAsync();
            if (!string.IsNullOrEmpty(text))
            {
                doWork(text);
                return true;
            }
        }
        catch (Exception e)
        {
        }
    }

    return false;
}