Архитектура приложения iOS с NSOperations

Два месяца назад я начал писать новое приложение для iPhone, и по этой причине я создал общий веб-сервис RESTFul, который позволяет мне иметь много таких необходимые функции, такие как аутентификация пользователей, профили пользователей, система дружбы, обработка мультимедиа, система обмена сообщениями и так далее. На мой взгляд, есть несколько вариантов использования этого веб-сервиса для будущих приложений для iPhone.

С таким настроем я решил написать статическую библиотеку для этого приложения (и всех будущих приложений), которая будет обрабатывать всю тяжелую работу, такую ​​как мультимедиа (изображения, видео, в настоящее время пользователь меняет изображение своего профиля, в то время как приложение отправляет данные о местоположении пользователя на сервер (в фоновом режиме) и получает новое push-уведомление.

Поэтому было принято решение заключить каждую логическую операцию (например, SendUserLocation или GetCurrentFriendList) в NSOperation и добавить их в serviceQueue (NSOperationQueue).

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

alt text

Типичный метод ServiceManager выглядит так:

- (void)activateFriendsSync:(id)observer onSuccess:(SEL)selector {
    ELOSyncFriends *opSyncFriends  = [[ELOSyncFriends alloc] initWithSM:self];
    [self ELServiceLogger:opSyncFriends];
    [serviceQueue addOperation:opSyncFriends];
    if(observer) {
        [self registerObserver:observer selector:selector name:opSyncFriends.notificationName]; 
    }
}

Каждая операция, запрос (к серверу) и подзадача использует GUID в качестве параметра notificationName для уведомления родительского объекта о завершении обработки. Если все в операции выполнено, он отправляет уведомление обратно в пользовательский интерфейс.

Тем не менее, код для добавления и удаления подзадач выглядит так

- (void)removeSubTask:(NSNotification*)notification {
    ELRequest *request = (ELRequest*)[notification object];
    [subTasks removeObjectIdenticalTo:request.notificationName];
    if([subTasks count] == 0) {
         // all SubTaks done, send notification to parent
        [serviceManager.notificationCenter postNotificationName:self.notificationName object:request];
    }
}

- (NSString*)addSubTask {
    NSString* newName = [self GetUUID];
    [subTasks addObject:[newName retain]];
    [serviceManager.notificationCenter addObserver:self selector:@selector(removeSubTask:) name:newName object:nil];
    return newName;
} 

- (NSString *)GetUUID {
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return [(NSString *)string autorelease];
}

Теперь все, что мне нужно сделать, это вызвать serviceManager в моем графическом интерфейсе, чтобы запустить определенную операцию, например

[self.core.serviceManager activateFriendsSync:nil onSuccess:nil];

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

[self.core.serviceManager activateFriendsSync:self onSuccess:@selector(myMethod:)];

Последний, но не менее важный мой вопрос (ы) : «Архитектура» работает очень хорошо и стабильно, но стоит ли это делать? Создает ли это слишком много накладных расходов? Это вообще имеет смысл? Как вы лично реализуете параллельные операции?

Лучшее но стоит ли это делать? Создает ли это слишком много накладных расходов? Это вообще имеет смысл? Как вы лично реализуете параллельные операции?

Лучшее но стоит ли это делать? Создает ли это слишком много накладных расходов? Это вообще имеет смысл? Как вы лично реализуете параллельные операции?

Лучшее Хенрик

PS Не стесняйтесь редактировать мой вопрос, задавать вопросы (в качестве комментария), называть меня именами для этого мышления.

Мне действительно было трудно это объяснить, в основном потому, что я не носитель английского языка. И не поймите меня неправильно. Я писал этот пост не для того, чтобы выпендриваться каким-либо образом. Все, что я хочу сделать, это узнать (и, возможно, написать более сложный вопрос для iphone / objective c)

10
задан justin 7 September 2012 в 01:37
поделиться