PCLStorage Xamarin.iOS的问题

时间:2017-02-07 15:35:42

标签: ios xamarin storage

我已经在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;                 
        }
    });
}

有什么想法吗? 感谢。

1 个答案:

答案 0 :(得分:0)

我还不知道为什么在等待你的任务时你在这里使用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;                 
    }
}

这更容易阅读,你摆脱了不必要的尝试/捕获。

您可能希望将ConfigureAwait(false)添加到您的任务中,因此您不需要进行太多的上下文切换。

你可以通过摆脱回调来简化你的方法,并且只是因为你的任务而返回一个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;
}