我已经尽可能多地阅读了块,但是我似乎无法理解这个概念。我经常使用块来调用对象所有者类中的成功和失败块。
所以,假设我有ClassA
一个变量ClassB
. 我打电话[ClassB method1]
。method1
假设一切顺利,为了增加运行成功块的能力,究竟必须投入什么method1
?它如何知道调用写入的成功块ClassA
?任何例子都会很棒。
我已经尽可能多地阅读了块,但是我似乎无法理解这个概念。我经常使用块来调用对象所有者类中的成功和失败块。
所以,假设我有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);
}
}
最后,在 A 类中:
[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
。希望这可以帮助!