2012-11-29 30 views
1

我已經儘可能多地閱讀了代碼塊,但是我似乎無法將這個概念包裹起來。我經常使用塊來調用對象所有者類中的成功和失敗塊。iOS Inter-class Block Signaling

所以,說我有ClassA與變量ClassB。我打電話給[ClassB method1]。在method1之內,爲了增加運行成功塊的能力,必須放入method1究竟是什麼狀態?它如何知道調用寫入ClassA的成功塊?任何例子都會很棒。

回答

2

這裏是一個粗略和快速的例子。

在ClassB.h定義函數與成功/失敗塊:

- (void)doSomethingOnSuccess:(void (^)(NSString *resultString))success 
        failure:(void (^)(NSError *error))failure; 

在ClassB.m:

- (void)doSomethingOnSuccess:(void (^)(NSString *resultString))success 
        failure:(void (^)(NSError *error))failure 
{ 
    // Do some task 
    BOOL taskSucceed = [self doSomeTask]; 
    if (taskSucceed) { 
    NSString *result = @"done"; 
    // Check for success block 
    if (success) 
     success(result); 
    } else { 
    // Generate error 
    NSError *error = ...; 
    if (failure) 
     failure(error); 
    } 

} 

最後,在ClassA的:

[ClassB doSomethingOnSuccess:^(NSString *resultString) { 
    // method succeeded 
} failure:^(NSError *error) { 
    // something failed 
} 
+0

謝謝。輕鬆理解非常有幫助。 – Niraj

0

剛將塊視爲可隨時存儲和執行的代碼塊。所以,你的類可以是這樣的:

ClassA.m

- (void)someMethod 
{ 
    ClassB *obj = [ClassB new]; 
    [obj doSomethingAndThen:^(BOOL success) { 
     if (success) { 
      NSLog(@"WIN!"); 
     } 
     else { 
      NSLog(@"Oh no"); 
     } 
    } 
} 

ClassB.h

typedef void (^SuccessBlock)(BOOL success); 

@interface ClassB : NSObject 

@property (nonatomic, copy) SuccessBlock successBlock; 

- (void)doSomethingAndThen:(SuccessBlock)block; 

@end 

ClassB.m

@interface ClassB 

- (void)doSomethingAndThen:(SuccessBlock)block 
{ 
    self.successBlock = block; 

    // Assume LRThing is something like NSURLConnection 
    LRThing *thing = [LRThing new]; 
    thing.delegate = self; 
    [thing start]; 
} 

- (void)longRunnigThingDidEnd 
{ 
    if (_successBlock) { 
     _successBlock(YES); 
     self.successBlock = nil; 
    } 
} 

- (void)longRunningThingDidFail 
{ 
    if (_successBlock) { 
     _successBlock(NO); 
     self.successBlock = nil; 
    } 
} 

@end 

這是一個非常簡單的例子,顯然你想做更多的檢查,例如在分配一個self.successBlock之前檢查您是否已經有一個塊。希望這可以幫助!