繁体   English   中英

在类方法中使用委托

[英]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

三个明显的选择:

  • 辛格尔顿
  • 指向委托的静态变量(即类变量)
  • 使用NSNotification的而不是委托

由于单例(和静态变量)无法跟踪委托的生命周期,因此我认为选项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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM