10

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.

alt text

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)

Respuesta

1

Usted acaba de describir una arquitectura muy similar que estoy usando en algunas de mis aplicaciones :)

tengo mi servicio de capa gestor de devolver un conjunto de objetos al instante y luego devolver un actualizadas establecidas después de un tiempo, es decir,

NSArray *stuff = [serviceManager getFriendsForUser:@"Bob"]; 

y luego, después de que el servidor ha respondido, una NSNotification es recibida que contiene una lista actualizada (de amigos para Bob en este caso).

Además de este pequeño cambio, ¡su arquitectura es la misma!

Trabajar es todo un trabajo, pero creo que vale la pena a largo plazo, ya que corregir errores/extender el código es mucho más fácil.

+0

Hola Dean, gracias por tu información. –

4

Sí, si está siendo procesado para solicitudes de servicio y usted tiene muchas llamadas que hacer, entonces tal biblioteca no es (demasiado) excesiva, y he escrito algo similar. esta estructura me facilitó la administración de un sistema complejo, con tareas muy complejas y variadas.

la principal diferencia de diseño que hice fue no para utilizar NSNotification con un administrador de servicio. en su lugar, preferí usar protocolos/tipos para devolución de llamadas (a los que la operación hace referencia). NSNotification es bastante pesado. en este caso, la operación no retiene los oyentes/objetos notificados, pero los oyentes retienen la operación. si la relación es 1-1, entonces permite la cancelación.

Otra consideración importante es definir el enhebrado desde el principio. permite a los clientes definir en qué subproceso desean recibir su respuesta. La razón para esto es que a menudo existe una restricción o entrada lógica para la devolución de llamada si el notificador/oyente debe actualizar la UI (por ejemplo, está usando UIKit o AppKit). por lo tanto, el creador puede decirle a la operación 'debes informarme desde el hilo principal', o 'puedo manejar la respuesta desde cualquier hilo'. esto reducirá su código de controlador/oyente/observador y la posibilidad de errores en gran medida.

2

Por "operaciones sub": ¿qué hay de ponerlos en la cola, con la operación de los padres siendo una dependencia (cf. -[ NSOperation addDependency: ]) de cada una de sus operaciones niño? NSOperationQueue puede secuenciar toda tu pila de operaciones por ti. Creo que esto es simple y natural para trabajar.