奇怪的自定义委托操作

时间:2011-03-18 22:15:08

标签: iphone objective-c ipad delegates

好的 - 这个很奇怪。我有一个单例类,从XML文件加载信息。我使用委托定义如下(我在一个单独的头文件中定义委托,以使生活更轻松):

@protocol ResourceClassDelegate <NSObject>

@optional
- (void)picturesDidStartLoading;
- (void)picturesDidFinishLoading;
@end

在资源文件中,正确定义了委托(我相信):

@property (assign) id<ResourceClassDelegate> delegate;

使用委托时,资源类中的代码如下:

-(void)refreshPiecesOfHistoryWithOperation {

    NSLog(@"Operation Started");
    if ([delegate respondsToSelector:@selector(picturesDidStartLoading)])
        [delegate picturesDidStartLoading];

    self.picturePacks = [HistoryXMLParser loadPicturePacks];

    [self.allPiecesOfHistory removeAllObjects]; 

    // now lets put all of them in one big file...
    for (PicturePack *pp in self.picturePacks) {
        for (int ct = 0; ct < [[pp piecesOfHistory] count] ; ct++) {
            [self.allPiecesOfHistory addObject:(PieceOfHistory *)[[pp piecesOfHistory] objectAtIndex:ct]];          
        }
    }

    NSLog(@"Operation Ended");
    if ([delegate respondsToSelector:@selector(picturesDidFinishLoading)])
        [delegate picturesDidFinishLoading];

}

现在......在正在侦听委托的类中,它被分配:

- (void)viewDidLoad {
    [super viewDidLoad];

    // now for the part that makes the loading all happen...
    [[ResourceClass sharedResourceClass] setDelegate:self];
}

在听力课中,方法被定义....

#pragma mark ResourceClassDelegate
-(void)picturesDidStartLoading {

    if (loadingActivity == nil)
        loadingActivity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

    [self.view addSubview:loadingActivity];
    [loadingActivity setCenter:[self.view center]];
    [loadingActivity startAnimating];

}

-(void)picturesDidFinishLoading {

    if (loadingActivity != nil) {
        [loadingActivity stopAnimating];
        [loadingActivity removeFromSuperview];
    }

    [self.tableView reloadData];
}

现在针对问题......每次在侦听类中调用方法(void)picturesDidFinishLoading。从未调用方法(void)picturesDidStartLoading。

当我调试代码时,在资源类中,行

if ([delegate respondsToSelector:@selector(picturesDidStartLoading)])
    [delegate picturesDidStartLoading];

永远不会到达委托方法调用 - 即使我删除了if语句。这条线

if ([delegate respondsToSelector:@selector(picturesDidFinishLoading)])
    [delegate picturesDidFinishLoading];
总是调用

任何想法?

2 个答案:

答案 0 :(得分:1)

好的 - 我想通了......

第一次通话时,代表是零。它是nil的原因是因为在init方法期间在源中调用了使用委托的函数。执行委托的第一次测试时,init方法未完成。此时委托是nil,因为在init方法完成之前它不会被实例化。委托的第二次测试工作的原因是因为我使用NSOperationQueue提交了流程。

要解决这个问题,我必须稍微改变一下......这都是关于时机的问题!

那么现在很有趣......

答案 1 :(得分:0)

这很奇怪,尝试删除协议声明中的@optional,看看是否有警告。

尝试在方法中打印日志,除了它看起来很好。