Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
Santer.Net
15 / 15 / 1
Регистрация: 18.11.2010
Сообщений: 122
#1

Проектирование кода - Objective-C

31.01.2013, 20:01. Просмотров 846. Ответов 3
Метки нет (Все метки)

Здравствуйте!
Вопрос концептуального характера. Как указано во многих источниках модель (в МВС с пасивной моделью) оповещает контроллер при помощи какого-нибудь вида коллбека. И как рпавило использует для этого паттерн обсервер.
У меня есть класс для работы с сервером. Он является моделью для некоторых контроллеров. Внизу приведен его интерфейс
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
@protocol AMServiceRoomListener;
 
/*!
 @interface AMServiceRoom
 @abstract  Encapsulate the entry point to communicate with DBBest server.It has methods to work
 with server room.
 @patterns Observer
 @property  publishers Store all publishers from server.
 */
@interface AMServiceRoom : NSObject
 
@property(nonatomic,retain) NSMutableArray *publishers;
 
/*!
 Task:Observation
 */
 
/*!
 @method     addListener:
 @abstract   Register observer for AMServiceRoom notifications
 @param      listener Object that support AMServiceRoomListener protocol
 */
- (void) addListener:(id<AMServiceRoomListener>)    listener;
/*!
 @method     removeListener:
 @abstract   Remove observer for AMServiceRoom notifications
 @param      listener Object that supports AMServiceRoomListener protocol
 */
- (void) removeListener:(id<AMServiceRoomListener>) listener;
 
/*!
 Task:Room queries
 */
 
/*!
 @method     refreshListOfPublishers:
 @abstract   This method fetchs new publishers from server and than notify all listeners.
 */
- (void) refreshListOfPublishers;
/*!
 @method     tokenForSessionID:
 @abstract   Gets token for sessionID.Notify all listeners.
 @param      sessionID Identifier of session.You can get it as a property from publisher.
 */
- (void) tokenForSessionID:(NSString *) sessionID;
/*!
 @method     chatMessageListForSessionID:messageID:
 @abstract   Gets all messages for session with sessionID
 @param      sessionID Identifier of session.You can get it as a property from publisher.
 @param      messageID Numeric identifier for message.(???)
 */
- (void) chatMessageListForSessionID:(NSString *) sessionID messageID:(NSString *) messageID;
/*!
 @method     sendMessage:messageID:forSessionID:token:userLastMsgID:
 @abstract   Send message for all subscribers and publishers in the room with sessionID.
 @param      messgae Message to send.
 @param      sessionID Identifier of session.You can get it as a property from publisher.
 @param      token Token for session with sessionID.
 @param      userLastMessageID Numeric identifier for message.(???)
 */
- (void) sendMessage:(NSString *) msg
        forSessionID:(NSString *)sessionID
               token:(NSString *) token
       userLastMsgID:(NSString *) userLastMessageID;
 
@end
 
@protocol AMServiceRoomListener <NSObject>
@optional
 
- (void) AMServiceDBBestRoom :(AMServiceRoom *) roomService
   didRefreshListOfPublishers:(NSMutableArray *) publishers;
 
- (void) AMServiceDBBestRoom:(AMServiceRoom *) roomService
                 didGetToken:(NSString *) token;
 
- (void) AMServiceDBBestRoom:(AMServiceRoom *) roomService
                       Error:(int) error;
 
- (void) AMServiceDBBestRoom :(AMServiceRoom *) roomService
               didGetMessages:(NSMutableArray *) messages;
 
@end
Т.е. мы добавляем подписчиков, с определенным интерфейсом (протоколом). Они вызывают необходимий им метод для получения данных, а затем мы их нотифицируем по тому же протоколу про свершенное событие и присылаем им данные.
Но я хочу улучшить обсервер. Хочу использовать KVO, а не свою кастомную реализацию. Но подумал, что тогда у в виду особеностей KVO мне прийдеться выставить наружу дополнительные свойства. С другой стороны можно просто добавить в методы блоки. Если успешно вызывать 1 блок иначе другой.
Дайте пожалуйста совет как в таком случае действуют. Когда лучше через КВО, когда лучше через блоки, когда лучше через нотификейшен сентр.
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2013, 20:01     Проектирование кода
Посмотрите здесь:

Turbo Pascal Напишите фрагмент кода для определения кода нажатой клавиши (расширенного кода в том числе)
Может ли грамотное проектирование и хороший стиль кода компенсировать бедность языка?
Рефакторинг кода. Objective-C
Objective-C Парсинг XML кода
Objective-C Парсинг HTML кода
Objective-C Что значат собака (@) и процент (%) в тексте кода
Проектирование БД MySQL
Objective-C Добавление кода отправки GET запроса в AppDelegate.m
Objective-C О написании чистого кода
Objective-C Возникла сложность в реализации кода. Начинающий в Objective C

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
666 / 528 / 44
Регистрация: 05.03.2010
Сообщений: 1,271
31.01.2013, 22:37     Проектирование кода #2
ну на самом деле, можно и проще сделать
Есть класс MyClass, за которым будет следить SomeOtherClass.
Для этого мы создаем протокол делегата и имплеменируем его в SomeOtherClass.
На моей практике это самый распространенный способ делегирования.
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// *** MyClass.h ***
 
@protocol MyClassDelegate;
 
@class MyClass <NSObject>
 
@property (nonatomic, assign) id<MyClassDelegate> delegate;
@property (nonatomic, retain) NSString *name;
 
@end
 
 
@protocol MyClassDelegate
 
@required
- (void)myClassDidSomething:(MyClass *)myClass;
 
@end
 
 
// *** MyClass.m ***
 
#import "MyClass.h"
 
@interface MyClass()
 
- (void)doSomething;
 
@end
 
 
@implementation MyClass
 
@synthesize delegate;
 
- (void)doSomething
{
    if ([self.delegate respondsToSelector:@selector(myClassDidSomething:)])
    {
        [self.delegate myClassDidSomething:self];
    }
}
 
- (void)dealloc
{
    self.delegate = nil;
    self.name = nil;
    [super dealloc];
}
 
@end
 
// *** SomeOtherClass.m ***
 
#import "MyClass.h"
 
@interface MyClass()
 
@property (nonatomic, retain) MyClass *myClass;
 
@end
 
 
@implementation SomeOtherClass <MyClassDelegate>
 
- (id)init
{
    self = [super init];
    if (self) 
    {
        self.myClass = [[[MyClass alloc] init] autorelease];
        self.myClass.name = @"My Cool Class!";
        self.myClass.delegate = self;
    }
    return self;
}
 
#pragma mark - MyClassDelegate implementation
 
- (void)myClassDidSomething:(MyClass *)_myClass
{
    NSLog([NSString stringWithFormat:@"MyClass instance with name: %@ did something!", _myClass.name]);
}
 
#pragma mark -
 
- (void)dealloc
{
    self.myClass = nil;
    [super dealloc];
}
 
@end
Блоки - вещь классная и со своими особенностями, но используются как-то намного реже, чаще удобней читать код с делегированием вместо блоков, хотя в таких библиотеках, как AFNetworking чаще можно встретить блоки и там они более актуальны, вприниципе это дело условное, как команда договорится, так и пишут.

Нотификейшн центры как-то не очень прижились, но очень актуальны при отловки событий AppDelegatе'а, но создавать свои как-то и не приходилось
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
01.02.2013, 01:56     Проектирование кода #3
Vorona, не прокатит. Человеку надо несколько делегатов информировать.

Santer.Net, чем Вас не устраивает текущая реализация? KVO только неразберихи добавит, на мой взгляд. Сейчас у вас ясно какой протокол должен реализовываться в классе-подписчике. Это косвенно указывает на то, чем этот класс занимается, что добавляет коду читабельности.

Что касается NSNotificationCenter, не советую им злоупотреблять. Отлаживать сложнее будет. Лично я его использую только в крайних случаях, когда сложно протянуть связь между нотификатором и приемником сообщения.
Vorona
Peace 2 all shining faces
666 / 528 / 44
Регистрация: 05.03.2010
Сообщений: 1,271
01.02.2013, 03:27     Проектирование кода #4
Цитата Сообщение от mobidevelop Посмотреть сообщение
Vorona, не прокатит. Человеку надо несколько делегатов информировать.
блин туплю чуть наночь
Yandex
Объявления
01.02.2013, 03:27     Проектирование кода
Ответ Создать тему
Опции темы

Текущее время: 17:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru