Странные пользовательские действия делегата - PullRequest
0 голосов
/ 19 марта 2011

Хорошо, это странно.У меня есть одноэлементный класс, который загружает информацию из файла 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 ]

1 голос
/ 19 марта 2011

Хорошо - я понял это ...

Делегат был нулевым во время первого звонка. Причина, по которой он равен nil, заключается в том, что функция, использующая делегат, была вызвана в источнике во время метода init. Метод init не был завершен, когда был выполнен первый тест делегата. В это время делегат был nil, потому что он не был создан, пока метод init не завершится. Причина, по которой второй тест делегата сработал, заключается в том, что я отправил процесс, используя NSOperationQueue.

Чтобы решить проблему, мне нужно немного передвинуть вещи ... все зависит от времени!

Ну, теперь это было весело ....

0 голосов
/ 19 марта 2011

Это странно, попробуйте удалить @optional в объявлении протокола и посмотрите, нет ли у вас предупреждений.

Попробуйте также распечатать журнал внутри метода, за исключением того, что он выглядит нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...