Два месяца назад я начал писать новое приложение для iPhone, и по этой причине я создал общий веб-сервис RESTFul, который позволяет мне иметь множество таких необходимых функций, как аутентификация пользователя, профили пользователей, система дружбы, обработка мультимедиа , система обмена сообщениями и так далее. На мой взгляд, есть несколько вариантов использования этого веб-сервиса для будущих приложений iPhone.
С таким состоянием ума я решил написать статическую библиотеку для этого приложения (и всех будущих приложений), которая обрабатывает все тяжелые работы, такие как настройка и обработка мультимедиа (изображения, видео, звука), связь с веб-службой, парсинг и отображение результатов, обработка CoreData и т. д.
Учитывая мое приложение, существуют сценарии, когда выполняется много параллельных задач (наихудший случай), например
пользователь в настоящее время меняет свое изображение профиля, в то время как приложение отправляет местоположение пользователей на сервер (в фоновом режиме), и поступает новое push-уведомление.
Поэтому решили инкапсулировать каждую логическую операцию (например, SendUserLocation или GetCurrentFriendList) в NSOperation и добавить их в serviceQueue (NSOperationQueue).
Каждая операция может порождать подзадачи, когда операция успешно получила результат от веб-службы и должна обработать его сейчас.
Типичный метод 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 в качестве источника уведомлений, чтобы уведомить родительский объект о завершении обработки. Если все в операции выполнено, он отправляет уведомление обратно в пользовательский интерфейс.
Тем не менее, код для добавления и удаления подзадач выглядит следующим образом
- (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:)];
Последний, но не менее важный мой вопрос (ы) : «Архитектура» работает очень хорошо и стабильно, но стоит ли это делать? Это создает слишком много накладных расходов? Это вообще имеет смысл? Как вы лично осуществляете параллельные операции?
Лучший
Хенрик
P.S. Не стесняйтесь редактировать мой вопрос, задавать вопросы (в качестве комментария), называть меня именами для этого мышления.
Мне действительно было трудно объяснить это, в основном потому, что я не являюсь носителем английского языка. И не поймите меня неправильно. Я не писал эту публикацию, чтобы хвастаться в любом виде. Все, что я хочу сделать, это научиться (и, возможно, написать более продвинутый вопрос по iphone / target c)