2013-01-18 79 views
0

他在那裏,我有一個簡單的樹結構的文件和文件夾。它是可以下載虛擬文件夾的客戶端 - 服務器應用程序的一部分。無論如何,我喜歡使用^塊異步編程。我有3個URL,第一個下載文件夾描述,第二個下載文件,第三個下載文件夾內容。 DSFolder是文件夾描述,DSFile從DSFolder繼承幷包含下載結果的NSData字段。文件夾下載的代碼如下所示:iPhone遞歸完成塊

- (void)loadFolderData:(DSFolder *)folder 
       finished:(void(^)(DSFolder *))finished 
       error:(void(^)(NSError *))error { 

    if (!folder) { 
     return; 
    } 
    for (DSFolder* fileOrFolder in folder.children) { 
     if ([fileOrFolder isFolder]) { 
      [self loadFolderData:fileOrFolder 
         finished:^(DSFolder * folder) { 

         // ********************************* 
         // Next folder level would be a copy 
         // of the whole for loop in here 
         // ********************************* 

        } error:^(NSError * err) { 
         if (error) { 
          error(err); 
         } 
        }]; 
     } else { 
      [self loadFile:fileOrFolder.name 
        folder:folder.name 
        finished:^(NSData * data) { 
         ((DSFile *) fileOrFolder).data = data; 
        } error:^(NSError * err) { 
         if (error) { 
          error(err); 
         } 
        }]; 
     } 
    } 
} 

那麼我可以只複製了幾次內部循環界限樹層深度,但似乎非常難看。我希望這個問題是合理的。

回答

1

遞歸已經運行的「環副本」給你:

- (void)loadFolderData:(DSFolder *)folder 
       finished:(void(^)(DSFolder *))finished 
       error:(void(^)(NSError *))error { 

    if (!folder) { 
     return; 
    } 
    for (DSFolder* fileOrFolder in folder.children) { 
     if ([fileOrFolder isFolder]) { 
      [self loadFolderData:fileOrFolder finished:nil error:error]; 
     } else { 
      [self loadFile:fileOrFolder.name 
        folder:folder.name 
        finished:^(NSData * data) { 
         ((DSFile *) fileOrFolder).data = data; 
        } error:error]; 
     } 
    } 
} 

我假設-loadFile:finished:error:正確處理一個零差錯塊。

一些其他的東西:

  • [self loadFile:fileOrFolder.name folder:folder.name ...]看起來像它做錯誤的事情,如果有子目錄:假設路徑a/b/cc文件名和b一個文件夾名稱,它會出現加載b/c
  • error被要求爲錯誤。這可能不是你想要的。它也不會返回導致錯誤的負載。
  • 有一個單一的回調是比較正常的,例如, void(^)(DSFolder*,NSError*)
  • finished未使用。看起來好像你希望在整個層次結束加載完成後調用它,這有點棘手。
+0

該錯誤塊是不是安全的零值,但謝謝指出。並沒有完成錯誤處理。當完成所有文件和文件夾時,應該調用結束塊。你有一個想法如何編程?那麼路徑是正確的,文件層次結構沒有真正的a/b/c結構,它是用數據庫條目創建的,服務器知道如何處理它。 –