le sugiero que utilice un patrón de sincronización asíncrona en este problema.
es necesario implementar dos métodos síncronos:
// Fetch the array of ID's
-(NSArray*)fetchItemIDsWithError:(NSError**)error;
// Fetch the item for a ID
-(Item*)fetchItemForID:(NSString*)itemID error:(NSError**)error;
la implementación de estas utilizando el código síncrono es fácil y comprobable. Puede utilizar métodos simples como dataWithURL…
, stringWithContentsOfURL…
, sendSynchronousRequest…
o ASIHTTPrequest con facilidad, y escribir sencillo pruebas unitarias para esto. El código también será extremadamente fácil de mantener y ampliar, comparado con la forma en que el código concurrente generalmente termina.
Ahora con el paso dos, crear una envoltura asíncrono, me gustaría utilizar un delegado y una firma método como este:
@protocol FetchItemsDelegate <NSObject>
-(void)didFetchItems:(NSArray*)array;
-(void)failedFetchItemsWithError:(NSError*)error;
@end
-(void)fetchItemsWithAsyncDelegate:(id<FetchItemsDelegate>)delegate;
usted ya tiene todo el código que hace lo que necesita, por lo que todo lo que tiene que hacer es impelente las partes asincrónicas. Este código se verá bien y será sencillo. Probaly no más que esto:
-(void)fetchItemsWithAsyncDelegate:(id<FetchItemsDelegate>)delegate;
{
[self performSelectorInBackground:@selector(backgroundFetchItemsWithDelegate:)
withObject:delegate];
}
-(void)backgroundFetchItemsWithDelegate:(id<FetchItemsDelegate>)delegate;
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
BOOL success = YES;
NSMutableArray* items = [NSMutableArray array];
NSError* error = nil;
NSArray* itemIDs = [self fetchItemIDsWithError:&error];
if (itemIDs) {
for (NSString* itemID in itemIDs) {
Item* item = [self fetchItemForID:itemID
error:&error];
if (item) {
[items addObject:item];
} else {
success = NO;
break;
}
}
} else {
success = NO;
}
if (success) {
[delegate performSelectorOnMainThread:@selector(didFetchItems:)
withObject:[NSArray arraiWithArray:items]
waitUntilDone:NO];
} else {
[delegate performSelectorOnMainThread:@selector(failedFetchItemsWithError)
withObject:error
waitUntilDone:NO];
}
[pool release];
}
He escrito una entrada en el blog ya sobre este tema aquí:. http://blog.jayway.com/2011/04/28/sync-asyn-pair-pattern-easy-concurrency-on-ios/
Es su requisito es algo como esto. req ---> respuesta (úsela para otra solicitud y también almacene alguna información) -> respuesta (nuevamente haga una nueva solicitud y almacene/use información) ---> respuesta ... y así sucesivamente? – Ravin
Sí, pero el problema es que la primera solicitud recupera todo lo que necesito en una solicitud. Por ejemplo, recibo 20 personas, cada una con una identificación. Quiero tomar cada identificación y hacer 20 solicitudes para recuperar un horario para cada una. Lo difícil es que la primera respuesta llene una UITableView con nombres. después de cada nombre quiero poner su horario individual. No sé, esto hizo que mi problema fuera más claro. – Silversnail