2017-02-07 5 views
0

Я написал свое приложение в Xamarin, сначала тестировалось для Android, а затем для iOS. На Android все работает отлично, а не в iOS. Моя проблема связана с PCLStorage, которая терпит неудачу при чтении содержимого файла, потому что результат GetFileAsync равен null, но не CheckExistsAsync результат.Проблемы с PCLStorage с Xamarin.iOS

Мой код:

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;     
     } 
    }); 
} 

Любая идея? Спасибо.

ответ

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

Это читает гораздо легче, и вы избавитесь от ненужной TRY/улова.

Возможно, вы захотите добавить ConfigureAwait(false) к своим задачам, поэтому вы не будете так много переключать контекст.

Вы могли бы упростить ваш метод много, избавившись от обратного вызова и просто возвращает логическое значение в результате вашей задачи:

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; 
} 
+0

Вы правы. Теперь без ContinueWith отлично работает :) спасибо – benjaminbutton

+0

Для обратного вызова это важно для меня по другим причинам ... большое спасибо – benjaminbutton

Смежные вопросы