Как разделить это на метод

#iphone #objective-c #ipad

#iPhone #objective-c #iPad

Вопрос:

Я пытаюсь реорганизовать свой код, чтобы он соответствовал хорошему шаблону OO, который является возможностью повторного использования и меньшим количеством повторений.. У меня есть следующий код:

  PFQuery * query = [PFQuery queryWithClassName:@"Vote"];
    query.cachePolicy = kPFCachePolicyNetworkElseCache;
    [query whereKey:@"poll" equalTo:self.vote];
    [query whereKey:@"note" notEqualTo:nil];
    [query countObjectsInBackgroundWithBlock:^(int number, NSError * error) {
        note = number;
        [self.noteCount addSubview:self.generateCountLabel];

        if (note > 0){
            [self.note setUserInteractionEnabled:YES];
            [self.note setEnabled:YES];
        }
    }];

    PFQuery * query1 = [PFQuery queryWithClassName:@"Vote"];
    query1.cachePolicy = kPFCachePolicyNetworkElseCache;
    [query1 whereKey:@"poll" equalTo:self.vote];
    [query1 whereKey:@"image" notEqualTo:nil];
    [query countObjectsInBackgroundWithBlock:^(int number, NSError * error) {
        pic = number;    
        [self.picCount addSubview:self.generateCountLabel];

        if (pic > 0){
            [self.pic setUserInteractionEnabled:YES];
            [self.pic setEnabled:YES];
        }

    }];
  

Было действительно сложно разделить на один метод, не выполняя много if. Есть идеи?

Ответ №1:

У вас может быть следующий метод….

 - (void)queryForKey:(NSString *)aKey view:(UIView *)aView countView:(UIView *)aCountView  {
    PFQuery * query = [PFQuery queryWithClassName:@"Vote"];        
    query.cachePolicy = kPFCachePolicyNetworkElseCache;
    [query whereKey:@"poll" equalTo:self.vote];
    [query whereKey:aKey notEqualTo:nil];
    [query countObjectsInBackgroundWithBlock:^(int number, NSError * error) {
        count = number;    
        [aCountView addSubview:self.generateCountLabel];

        if (count > 0){
            [aView setUserInteractionEnabled:YES];
            [aView setEnabled:YES];
        }
    }];
}
  

Затем вы можете вызвать…

 [self queryForKey:@"note" view:self.note countView:self.noteCount];
[self queryForKey:@"image" view:self.pic countView:self.picCount];
  

Если вы утвердите свое именование, вы можете использовать динамические селекторы объектов, т. Е. Для ‘note’ у вас есть @»note», self.note и self.noteCount, чтобы вы могли взять @»note» и динамически выбирать представления note и noteCount (поскольку они оба начинаются с ‘note’), однако это не сработает для вашего изображения, поскольку у вас есть @»image», но затем self.pic и self.picCount.

Обновить

Переименуйте изображение в pic, а затем предоставьте четыре вида (picCount, pic, note и noteCount) в качестве свойств. Тогда вы можете использовать что-то вроде этого…

 - (void)queryForKey:(NSString *)aKey  {
    PFQuery * query = [PFQuery queryWithClassName:@"Vote"];        
    query.cachePolicy = kPFCachePolicyNetworkElseCache;
    [query whereKey:@"poll" equalTo:self.vote];
    [query whereKey:aKey notEqualTo:nil];
    [query countObjectsInBackgroundWithBlock:^(int number, NSError * error, NSString *aKey) {
        [self setValue:number forKey:aKey];
        UIView *countView = [self objectForKey:[NSString stringWithFormat:@"%@Count", aKey]];
        [countView addSubview:self.generateCountLabel];

        if (number > 0){
            UIView *mainView = [self objectForKey:aKey];
            [mainView setUserInteractionEnabled:YES];
            [mainView setEnabled:YES];
        }
    }];
}
  

Вам придется поиграть с этим, поскольку у меня нет вашего полного определения класса, чтобы получить его точно.

Комментарии:

1. можете ли вы привести мне пример того, как это делается динамически, если бы я также изменил имя с изображения на рис

2. ваш синтаксис также испорчен, что здесь считается? это не определено в сигнатуре метода, query1 и query конфликтуют

3. также count — это int, и я нигде не вижу его в вашей подписи функции.. Я пытался добавить количество в качестве параметра и назначить его, но это не работает

4. и что, если я не смогу передать ключ в качестве параметра блока, это все равно будет работать?