ASIHttpRequest problemas. “Selector no reconocido enviado a la instancia”
-
26-09-2019 - |
Pregunta
Tengo problemas utilizando ASIHttpRequst. Este es el error que consigo:
2010-04-11 20:47:08.176 citybikesPlus[5885:207] *** -[CALayer rackDone:]: unrecognized selector sent to instance 0x464a890
2010-04-11 20:47:08.176 citybikesPlus[5885:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[CALayer rackDone:]: unrecognized selector sent to instance 0x464a890'
2010-04-11 20:47:08.176 citybikesPlus[5885:207] Stack: (
33936475,
2546353417,
34318395,
33887862,
33740482,
126399,
445238,
33720545,
33717320,
40085013,
40085210,
3108783,
11168,
11022
)
Y este es mi código (parte de ella):
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
[image setImage:[UIImage imageNamed:@"bullet_rack.png"]];
BikeAnnotation *bike = [[annotationView annotation] retain];
bike._sub = @"";
[super viewDidLoad];
NSString *newUrl = [[NSString alloc] initWithFormat:rackUrl, bike._id];
NSString *fetchUrl = [newUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[networkQueue cancelAllOperations];
[networkQueue setRequestDidFinishSelector:@selector(rackDone:)];
[networkQueue setRequestDidFailSelector:@selector(processFailed:)];
[networkQueue setDelegate:self];
ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:fetchUrl]] retain];
[request setDefaultResponseEncoding:NSUTF8StringEncoding];
[networkQueue addOperation:request];
[networkQueue go];
}
- (void)rackDone:(ASIHTTPRequest *)request
{
NSString *resultSearch = [request responseString];
NSData *data = [resultSearch dataUsingEncoding:NSUTF8StringEncoding];
NSString *errorDesc = nil;
NSPropertyListFormat format;
NSDictionary * dict = (NSDictionary*)[NSPropertyListSerialization
propertyListFromData:data
mutabilityOption:NSPropertyListMutableContainersAndLeaves
format:&format
errorDescription:&errorDesc];
rackXmlResult* fileResult = [[[rackXmlResult alloc] initWithDictionary:dict] autorelease];
rackXmlSet *rackSet = [fileResult getRackResult];
NSString *subString = [[NSString alloc] initWithFormat:@"Cyklar tillgängligt: %@ -- Lediga platser: %@", rackSet._ready_bikes, rackSet._empty_locks];
[activity setHidden:YES];
[image setHidden:NO];
BikeAnnotation *bike = [annotationView annotation];
bike._sub = subString;
}
- (void) processFailed:(ASIHTTPRequest *)request
{
UIAlertView *errorView;
NSError *error = [request error];
NSString *errorString = [error localizedDescription];
errorView = [[UIAlertView alloc]
initWithTitle: NSLocalizedString(@"Network error", @"Network error")
message: errorString
delegate: self
cancelButtonTitle: NSLocalizedString(@"Close", @"Network error") otherButtonTitles: nil];
[errorView show];
[errorView autorelease];
}
El proceso se carga como LeftCalloutView en la burbuja de llamada cuando se cargan las anotaciones en mi MapView, por lo mucho (80 veces más o menos). Tiene el propósito de recuperar una Plist XML desde un servidor, analizar y utilizar los datos ... pero muere en el rackDone:
¿Alguien tiene alguna idea?
Saludos, Paul Peelen
Solución 2
I encontró la solución usando [self retain]
. Parece que ya me carga el objeto tan a menudo, no se auto asigna el tiempo suficiente para recibir el rackDone:. La acción
Ahora funciona. Ahora sólo tiene que averiguar cómo puedo cargar esta solicitud, no cuando se carga la aplicación.
Otros consejos
Bueno, el problema parece ser que su objeto networkQueue
(sea lo que sea NSOperationsQueue subclase?) Está enviando el mensaje a rackDone:
vista del viewController en lugar de la propia viewController. CALayers son atributos de puntos de vista no viewControllers por lo que el error tiene que venir de una vista.
Compruebe el código para networkQueue
.
También no parecen estar usando la notación self
para networkQueue
y si es una propiedad de la clase que puede morir sin previo aviso, ya que no se conserva adecuadamente.