我尽可能多地阅读过积木,但是我似乎无法理解这个概念。我经常使用块来利用块来调用对象所有者类中的成功和失败块。
所以,我说ClassA
的变量为ClassB
。我打电话给[ClassB method1]
。为method1
添加运行成功块的能力,假设一切顺利在method1
内,必须放入什么?如何知道调用写入ClassA
的成功块?任何例子都会很棒。
答案 0 :(得分: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
}
答案 1 :(得分: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
之前检查您是否已经有一个块。希望这有帮助!