#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. и что, если я не смогу передать ключ в качестве параметра блока, это все равно будет работать?