2012-07-05 210 views
9

我討厭塊。它們旨在使代碼更簡潔,但我找不到更難看的東西。例如,對於AFNetworking:有沒有辦法將方法作爲塊傳遞?

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
      requestsuccess:^(NSURLRequest *request, NSURLResponse *response, id JSON) { 
    // Some 
    // very 
    // long 
    // (and as ugly as blocks) 
    // processing 
} 
        failure:^(NSURLRequest *request, NSURLResponse *response, NSError *error, id JSON)) { 
    // Failure code 
}] 

像這樣的已經好多了:

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
      requestsuccess:@selector(requestSuccess:response:json:) 
        failure:@selector(requestSuccess:response:error:)] 

那麼,是不是可以使用方法的選擇是塊?如果不是,我怎樣才能讓分組代碼更好?

它讓我很煩,因爲這些塊似乎是Objective-C編程的未來,而且它們只是不可讀。

+3

起初,塊可能看起來很醜,但它們很強大,有一些特定的原因,它們似乎是未來。我會建議你這篇文章有一個很好的見解:http://ios-blog.co.uk/articles/tutorials/programming-with-blocks-an-overview/ – Alladinian 2012-07-05 20:09:37

+1

塊不會使代碼更簡潔,他們使代碼更強大。 – dreamlax 2012-07-05 20:30:42

+0

我認爲這是一個有效的問題。由於塊既可以接收參數(0..n)並返回一個參數或void,方法應該可以用作塊...或者換句話說,在類級定義塊將會很好。我不認爲你可以... – 2015-01-10 21:36:50

回答

6

所以你認爲塊結構使代碼難以閱讀? 我認爲他們有時可以讓事情變得更容易理解,尤其是在網絡代碼等異步情況下。

爲了便於閱讀,您可以將塊分配給變量。 (事實上​​塊是目標c對象。)

實施例:

typedef void(^SuccessBlock)(NSURLRequest *request, NSURLResponse *response, id JSON); 

SuccessBlock successBlock = ^(NSURLRequest *request, NSURLResponse *response, id JSON) { 
    // code block 
}; 

AFJSONRequestOperation* operation; 
operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
                  success:successBlock 
                  failure:nil]; 

還可以調用該塊內的單個處理程序方法以保持其小。

+0

它修復了很多「風格」問題,我認爲這是最好的方法。謝謝 ! – 2012-07-06 16:55:24

1

您可以剝離這些塊,以便它們不是方法調用的內嵌參數。它仍然涉及一些塊醜,但仍提高一些可讀性:

void (^successBlock)(NSURLRequest *request, NSHTTPURLResponse *response, id JSON); 

successBlock =^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    // Some 
    // very 
    // long 
    // (and as ugly as blocks) 
    // processing 
}; 
//do same for failure block as "failureBlock" 
... 

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
      requestsuccess:successBlock 
        failure:failureBlock]; 
1

短塊都不錯,過長的人不是,您畫線當然是個人喜好...

使用方法塊並不難(周圍的其他方法更多的是一種挑戰)。 - 無論它是值得的,是給你

- (void) requestSuccess:(NSURLRequest *)request 
       response:(NSURLResponse *)response 
        json:(id)JSON 
{ 
    // Some 
    // very 
    // long 
    // (and as ugly as blocks) 
    // processing 
} 

- (void) requestFailure:(NSURLRequest *)request 
       response:(NSURLResponse *)response 
        error:(NSError **)error 
        json:(id)JSON 
{ 
    // Failure code 
} 

... 

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
     requestsuccess:^(NSURLRequest *request, NSURLResponse *response, id JSON) 
     { 
      [self requestSuccess:request response:response json:JSON]; 
     } 
     failure:^(NSURLRequest *request, NSURLResponse *response, NSError *error, id JSON)) 
     { 
      [self requestFailure:request response:response error:error json:JSON]; 
     }] 

你可以用宏走得更遠,甚至performSelector/NSInvocation有趣:如果你想使用的方法最簡單的方法。

您也可以調用本身之前移動塊定義,沿着線:

var = block; 
[object method:var]; 

哪種方法你選擇的是一個風格問題。

相關問題