将委托作为id发送而不是将其设置为属性?

时间:2011-10-12 01:59:50

标签: objective-c ios ios4 delegates

我有一个类对象,我在不同的地方使用了很多。

现在我正在使用这样的课程:

myClass.delegate = self;
[myClass doSomething];

doSomething会创建一个新的类对象来计算内容,并且可能需要最多1分钟才能将结果发回给委托,如下所示:

-(void)doSomething {
   CalculateStuff *calc = [[calculateStuff alloc] init];
   calc.delegate = self;
   [calc calculate];
}

/* Calculate Delegate */
-(void)didCalculate {
   [[self delegate] didDoSomething];
}

问题是我从另一个地方调用同样的东西,它将调用我的最新代表,这会导致很多问题。

问题:

有没有办法将委托作为对象发送而不必将其设置为属性? 我这样写了,Xcode给了我警告“MyClass的不完整实现”

[myClass doSomethingWithDelegate:self];

-(void)doSomethingWithDelegate:(id)delegate {
   CalculateStuff *calc = [[calculateStuff alloc] init];
   [calc calculateWithDelegate:delegate];
}

/* Calculate Delegate */
-(void)didCalculateWithDelegate:(id)delegate {
   [delegate didDoSomething];
}

修改 刚试了一下它似乎工作,但我怎么能摆脱Xcode中的警告?

1 个答案:

答案 0 :(得分:1)

我认为您的问题是您忘记从类的接口(或类扩展)中删除doSomethingdidCalculate的声明。


理想情况下,您应该创建一个协议以确保您的委托具有所需的方法。例如:

@protocol DoSomethingDelegate <NSObject>
- (void)didDoSomething;
@end

然后使用id<DoSomethingDelegate>而不只是id


传递一个块也是解决这个问题的有效方法,虽然它有点棘手。