[英]using a delegate in a class method
我想在类方法中调用一个委托。
下面的示例显然不起作用,因为委托是在类方法中访问的实例变量。 (错误:在类方法中访问了实例变量“委托”)
有警报吗?
我的头文件:
// MyClass.h
#import <Foundation/Foundation.h>
@protocol MyDelegate <NSObject>
-(void)update;
@end
@interface MyClass : NSObject
{
id<MyDelegate> delegate;
}
@property (nonatomic, retain) id delegate;
+(void)methodThatInvokesDelegate;
@end
我的实施文件:
// MyClass.m
#import "MyClass.h"
@implementation MyClass
@synthesize delegate;
+(void)methodThatInvokesDelegate{
[delegate update];
}
@end
三个明显的选择:
由于单例(和静态变量)无法跟踪委托的生命周期,因此我认为选项3是最干净的。
我想知道上下文,它可以让您在这种情况下运行。 ;-)无论如何:
第一:为特定实例对象设置代理。 因此,您可以为同一(委托)类的不同实例使用不同的委托。
第二:类方法在该类的类对象内运行。 这是一个与该类的每个实例对象不同的对象。 因此,没有什么可以称为“委托人”。 您可以有100个代表。
第三:您的类对象需要自己的委托。 因此,您必须向类对象添加属性delegate
,然后使用它。 (是的,这是可能有特性的一类对象。我没有写声明的属性)。如果您需要关于如何做到这一点的详细信息,只是发表评论吧。 我将添加代码。
我不确定这是否对您有帮助,但是在类似的情况下,我有一个用于数据加载的类方法。 在这种情况下,该类将实例化(这样,调用者就不需要这样做)直到完成。 (对此代码进行了一些编辑,以使其在这里工作)
头文件:
@protocol DataLoaderDelegate2 <NSObject>
- (void) dataLoaderSuccess:(NSData *)data loader:(id)theloader;
- (void) dataLoaderFailed:(NSString *)error loader:(id)theloader;
@end
@interface DataLoader2 : NSObject {
NSURLConnection *conn;
NSMutableData *receivedData;
NSFileHandle *fileHandle;
id <DataLoaderDelegate2> delegate;
}
@property (nonatomic, assign) id<DataLoaderDelegate2>delegate;
调用以启动该过程-调用initWithRequest会传递“ self”。
+ (DataLoader2 *)loadWithURLRequest:(NSURLRequest *)req delegate:(id)_delegate
{
DataLoader2 *dl = [[DataLoader2 alloc] init];
[dl setDelegate:_delegate];
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
return dl;
}
数据加载完成后,将使用类似以下内容进行清理
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if ([delegate respondsToSelector:@selector(dataLoaderSuccess:loader:)])
[delegate dataLoaderSuccess:(fileHandle)?(id)fileHandle:(id)receivedData loader:self];
[self autorelease];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.