Hace dos meses comencé a escribir una nueva aplicación para iPhone y por esta razón creé un servicio web genérico RESTFul, que me permite tener muchas de estas características necesarias como autenticación de usuario, perfiles de usuario, sistema de amistad, procesamiento de medios, un sistema de mensajería, etc. En mi opinión, hay varios casos de uso para reutilizar este servicio web para futuras aplicaciones de iPhone.iOS App Architecture con NSOperations
Con este estado de ánimo, decidí escribir una biblioteca estática para esta aplicación (y todas las aplicaciones futuras) que maneja todo el trabajo pesado como configuración y procesamiento de medios (imagen, video, sonido), comunicándose con el servicio web , análisis y mapeo de los resultados, manejo de CoreData, etc.
Dada mi aplicación existen situaciones en las que se ejecutan muchas tareas paralelas (peor caso), p. el usuario actualmente cambia su foto de perfil, mientras que la aplicación envía la ubicación de los usuarios al servidor (en segundo plano) y se recibe una nueva notificación de inserción.
Así que decidió encapsular cada operación lógica (como SendUserLocation o GetCurrentFriendList) en una NSOperation y agregarlas a un serviceQueue (NSOperationQueue).
Cada operación puede generar subtareas cuando la operación obtuvo un resultado del servicio web y debe procesarla ahora.
Un método ServiceManager típica se parece a
- (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];
}
}
Cada operación, la solicitud (en el servidor) y subtarea utiliza un GUID como un notificationName notificar al objeto padre cuando se termine de procesarse. Si todo en una operación está hecho, envía una notificación a la interfaz de usuario.
Dicho esto, el código para agregar y quitar subtareas se parece a esto
- (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];
}
Ahora todo lo que tenemos que hacer es llamar al ServiceManager en mi interfaz gráfica de usuario para iniciar una operación específica como
[self.core.serviceManager activateFriendsSync:nil onSuccess:nil];
Si yo quiero registrar un observador, acabo de pasar un objeto observador y un selector como esto
[self.core.serviceManager activateFriendsSync:self onSuccess:@selector(myMethod:)];
Por último pero no menos importante, mi pregunta (s): La "arquitectura" funciona muy bien y es estable, pero ¿vale la pena hacerlo? ¿Crea demasiada sobrecarga? ¿Tiene sentido? ¿Cómo usted, personalmente, implementa operaciones simultáneas?
Mejor Henrik
P. S. Siéntete libre de editar mi pregunta, hacer preguntas (como un comentario), llámame nombres para este pensamiento.
Realmente tuve un momento difícil para explicarlo, básicamente porque no soy un hablante nativo de inglés. Y no me malinterpretes No escribí esta publicación para presumir de ningún tipo.Todo lo que quiero hacer es aprender (y tal vez para escribir una pregunta más avanzada iPhone/objetivo c)
Hola Dean, gracias por tu información. –