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;
}
我用 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;
}