我已經儘可能多地閱讀了代碼塊,但是我似乎無法將這個概念包裹起來。我經常使用塊來調用對象所有者類中的成功和失敗塊。iOS Inter-class Block Signaling
所以,說我有ClassA
與變量ClassB
。我打電話給[ClassB method1]
。在method1
之內,爲了增加運行成功塊的能力,必須放入method1
究竟是什麼狀態?它如何知道調用寫入ClassA
的成功塊?任何例子都會很棒。
我已經儘可能多地閱讀了代碼塊,但是我似乎無法將這個概念包裹起來。我經常使用塊來調用對象所有者類中的成功和失敗塊。iOS Inter-class Block Signaling
所以,說我有ClassA
與變量ClassB
。我打電話給[ClassB method1]
。在method1
之內,爲了增加運行成功塊的能力,必須放入method1
究竟是什麼狀態?它如何知道調用寫入ClassA
的成功塊?任何例子都會很棒。
這裏是一個粗略和快速的例子。
在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
}
剛將塊視爲可隨時存儲和執行的代碼塊。所以,你的類可以是這樣的:
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
之前檢查您是否已經有一個塊。希望這可以幫助!
謝謝。輕鬆理解非常有幫助。 – Niraj