2014-03-19 51 views
2

在JavaScript中,有這樣的承諾概念,您可以將函數作爲參數傳遞給另一個函數。例如:Javascript promise in objective-c

doSomething(doSomethingElse()); 

我已經在Objective-C中編寫了一個基於塊的代碼。代碼的示例用法如下:

[MyObject doSomethingWithSuccessHandler:^() 
{ 
    [My object doSomethingMoreWithSuccessHandler:^() 
    { 
     [myObject saveTheResults]; 
    } 
    failureHandler:^(MYError *myError) 
    { 
     [MyObject logError:myError]; 
    }]; 
} 
failureHandler:^(MYError *myError) 
{ 
    [MyObject logError:myError]; 
}]; 

的相反,我的基於塊的碼被用作顯示在上面的片段的方式,我想它以下述方式被使用(如JavaScript諾言) :

[MyObject doSomethingAndOnSuccess:[myObject doSomethingMoreAndOnSuccess:[myObject saveTheResults] onFailure:[myObject logError] ] onFailure:[myObject logError] ]; 

這可能嗎?這只是爲了代碼的可讀性,您可以看到,在第一種情況下,我想避免使用很多金字塔代碼。

+0

@Cocoadelica,或者您誤解了我的問題,或者我無法在您提供的鏈接中看到預期的解決方案。爲了消除混淆,我已經實現了基於塊的代碼,並且我非常瞭解基於塊的編程,我正在尋找的方法是將方法作爲參數傳遞給其他方法,如問題的最後一個代碼片段中: [MyObject doSomethingAndOnSuccess:[myObject doSomethingMoreAndOnSuccess:[myObject saveTheResults] onFailure:[myObject logError]] onFailure:[myObject logError]]; –

+0

啊是的,我誤讀了。道歉:)今天有點困了。 – Cocoadelica

+0

查看Facrbook和Parse的Bolts。這些會給你你想要的。 – Fogmeister

回答

1

你傳遞的內容仍然需要塊而不是方法調用,但是來自評論中鏈接的typedef建議可以使事情更清晰。

例如爲:

typedef void (^FailureBlock)(NSError *); 
typedef void (^SuccessBlock)(); 

- (void)startsHere 
{ 
    FailureBlock f = ^(NSError *myError){ 
     [self logError:myError]; 
    }; 
    SuccessBlock s2 = ^(){ 
     [self saveTheResults]; 
    }; 
    SuccessBlock s1 = ^(){ 
     [self doSomethingMoreWithSuccessHandler:s2 
        failureHandler:f]; 
    }; 

    [self doSomethingWithSuccessHandler:s1 
      failureHandler:f]; 
} 
+0

這會讓我從金字塔代碼中解脫出來,但是我不得不將這些代碼塊聲明爲變量,從而導致更多的代碼。雖然在我有幾個基於塊的方法的情況下,這個解決方案確實很方便,但是我的項目中有幾百個基於塊的方法,這些解決方案不適合。 –

+0

我想這取決於你的喜好。更多的代碼可能很糟糕,但難以解開的嵌套層次可能更糟。 [聳肩] –