J'ai commencé à utiliser le framework ObjectiveFlickr dans le but de créer une application de carte iPhone relativement simple montrant le contenu flickr géolocalisé dans la région MKMapView actuelle. Je me suis heurté à des problèmes liés au filetage before et maintenant j'ai le sentiment que je reçois quelque chose de fondamentalement faux dans mon architecture. En fait ce que j'ai est:Le bon endroit pour faire les choses en Objective-C
- Un MainViewController qui crée et gère l'objet MKMapView et un bouton
- En appuyant sur le bouton appelle une méthode qui appelle l'API Flickr photos géolocalisées dans la carte actuelle ampleur.
- La méthode de rappel pour cet appel d'API itère à travers les résultats et les place dans un NSMutableArray d'objets FlickrImage. FlickrImage est une classe de données simple contenant l'emplacement de l'image flickr sous la forme d'une CLLocation, d'un NSURL pointant sur la vignette et d'un titre NSString.
extrait de code pour l'étape 2:
-(void)actionSearchForTripodPhotos {
if(currentBoundingBox == nil) {
// TODO add a messagebox saying we're waiting for location info - or just lock the app until we're sure.
return;
}
NSString *dateTakenMinimumUNIXTimeStampString = [NSString stringWithFormat:@"%f",[[NSDate dateWithTimeIntervalSinceNow:-100000] timeIntervalSince1970]];
OFFlickrAPIRequest *flickrAPIRequest = [[OFFlickrAPIRequest alloc] initWithAPIContext:[CloudMadeMap101AppDelegate sharedDelegate].flickrAPIContext];
[flickrAPIRequest setDelegate:self];
NSString *flickrAPIMethodToCall = @"flickr.photos.search";
NSString *bboxString = [NSString stringWithFormat:@"%f,%f,%f,%f",currentBoundingBox.bottomLeftLat ,currentBoundingBox.bottomLeftLon ,currentBoundingBox.topRightLat ,currentBoundingBox.topRightLon];
NSLog(@"bounding box to be sent to flickr: %@",bboxString);
NSDictionary *requestArguments = [[NSDictionary alloc] initWithObjectsAndKeys:FLICKR_API_KEY,@"api_key",[NSString stringWithFormat:@"%f",currentLocation.coordinate.latitude],@"lat",[NSString stringWithFormat:@"%f",currentLocation.coordinate.longitude],@"lon",dateTakenMinimumUNIXTimeStampString,@"min_upload_date",nil];
[flickrAPIRequest callAPIMethodWithGET:flickrAPIMethodToCall arguments:requestArguments];
}
extrait de code
pour l'étape 3:
- (void)flickrAPIRequest:(OFFlickrAPIRequest *)inRequest didCompleteWithResponse:(NSDictionary *)inResponseDictionary {
NSDictionary *photosDictionary = [inResponseDictionary valueForKeyPath:@"photos.photo"];
NSDictionary *photoDictionary;
FlickrImage *flickrImage;
for (photoDictionary in photosDictionary) {
NSLog(@"photodictionary is %@",[photoDictionary description]);
flickrImage = [[FlickrImage alloc] init];
flickrImage.thumbnailURL = [[appDelegate sharedDelegate].flickrAPIContext photoSourceURLFromDictionary:photoDictionary size:OFFlickrThumbnailSize];
flickrImage.hasLocation = TRUE; // TODO this is actually to be determined...
flickrImage.ID = [NSString stringWithFormat:@"%@",[photoDictionary valueForKeyPath:@"id"]];
flickrImage.owner = [photoDictionary valueForKeyPath:@"owner"];
flickrImage.title = [photoDictionary valueForKeyPath:@"title"];
[flickrImages addObject:flickrImage];
[photoDictionary release];
}
}
Ce tout va bien. L'API ne renvoie pas de géolocalisation pour chaque photo, ce qui nécessite un autre appel d'API. Je pensais que je pourrais le faire à partir de la classe FlickrImage, mais ici ça devient laid:
- Le MainViewController crée une instance de FlickrImage chaque itération et le stocke dans le NSMutableArray.
- L'instance FlickrImage appelle de façon asynchrone l'API Flickr de géolocalisation et doit stocker les coordonnées renvoyées dans la variable membre appropriée.
Je suis assez sûr que cela ne se produit pas parce que je reçois
malloc: *** error for object 0x451bc04: incorrect checksum for freed object - object was probably modified after being freed.
saupoudré autour de ma sortie de débogage, et presque toujours un EXC_BAD_ACCESS
mais pas toujours au même point.
Je fais clairement quelque chose de fondamentalement faux ici, mais quoi?
Avez-vous une idée de la destination de l'objet 0x452bc04? Si vous consignez les adresses de vos objets, en particulier les objets FlickrImage, vous pouvez alors regarder l'adresse du débogueur et voir au moins quelle classe a échoué. – TechZen
Vous devez coller votre code des deux dernières étapes (création, stockage et modification de FlickrImages). –
@ kai1968 - extraits de code ajoutés – mvexel