我试图通过其他以及Apple的例子。我输了。
我有一个单例类,用于处理我的用户登录(挑战Web服务器等)。
我想创建一个我可以调用的块,传入用户名/密码。该块将执行Web服务调用,如果成功则返回。
这是我迄今为止努力工作的原因:
我的单身人士课程如下:
·H
typedef void (^AMLoginBlock)(NSString *userName, NSString *password);
@interface AuthManager : NSObject
+ (id)sharedManager;
+ (bool)loginUserWithBlock:(AMLoginBlock)block;
@end
的.m
@implementation AuthManager
+ (id)sharedManager
{
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init]; // or some other init method
});
return _sharedObject;
}
+ (bool)loginUserWithBlock:(AMLoginBlock)block {
NSLog(@"im printing from AM");
return true;
}
@end
然后我调用这样的方法:
bool rtn = [AuthManager loginUserWithBlock:^(NSString *userName, NSString *password) {
NSLog(@"im here in the block LVC.");
}];
我的问题分为三部分:
如何为类似于UIView animation...
块的块编写完成处理程序。
从基于块的实现执行这些Web服务调用是一个好主意吗?
我应该像这样声明块方法:
- (bool)loginUserWithBlock:(AMLoginBlock)block;
而不是使用+(bool)loginUser..
,因为它在单例类中。不确定这是否会导致创建单个实例的多个实例。
我的目标是能够像调用[UIView animation..]
一样调用此块。所以我可以这样做:
[AuthManager loginUserWithUsername:foo
password:bar1
completion:^(BOOL finished) {
if (finished)
//push new view controller.
else
//spit out error
}];
答案 0 :(得分:6)
您需要将完成块复制到类iVar:
@property (nonatomic, copy) void (^completionHandler)(bool *);
因为您正在保存块,所以需要使用非类方法(请参阅以下内容,了解如何在不违反单例的情况下执行此操作)。您的方法的一个示例可能是:
- (void)loginUserWithUsername:(NSString *)username
password:(NSString *)password
completion:(void(^)(bool *finished))completionBlock
{
// Copy the blocks to use later
self.completionHandler = completionBlock;
// Run code
[self doOtherThings];
}
然后当您的登录代码完成其工作时,您可以调用该块 - 在这里我将self.error,bool
传递给该块:
- (void)finishThingsUp
{
// We are done with all that hard work. Lets call the block!
self.completionHandler(self.error);
// Clean up the blocks
self.completionHandler = nil;
}
嗯,这是一个哲学问题,但我会这样说:Objective-C中的块允许您编写执行单个任务的代码,并轻松地将其集成到许多程序中。如果您选择不在登录代码中使用完成处理程序,则需要登录代码:
LoginDelegate
)任何上述方法都很好,我觉得基于块的回叫系统是最简单和最灵活的。它允许您只使用您的类而无需担心其他基础结构(设置通知,符合协议等),同时仍允许您在其他类或程序中重用它。
以Objective-C中的+
开头的方法是类方法。你不能使用类方法来操纵iVars,因为谁拥有这些数据?
你可以做的是有一个类方法,它总是返回该类的同一个实例,允许你拥有一个可以拥有数据的对象,但是避免使用多个对象。
This excellent Stack Overflow answer has sample code
祝你好运!