我开始尝试使用 ObjectiveFlickr 框架,目标是创建一个相对简单的 iPhone 地图应用程序,显示当前 MKMapView 区域内带地理标记的 flickr 内容。我遇到了与线程相关的问题before https://stackoverflow.com/questions/1870705/objc-delegate-methods-never-gets-called现在我感觉我的架构出现了根本性的错误。基本上我所拥有的是:
- 创建一个 MainViewController
并处理 MKMapView 对象和
一个按钮
- 点击按钮即可调用
调用 Flickr API 的方法
对于以下范围内带有地理标记的照片
当前地图范围。
- 回调
迭代此 API 调用的方法
通过结果并将其放入
FlickrImage 对象的 NSMutableArray。 FlickrImage 是一个简单的数据类,将 flickr 图像位置保存为 CLLocation、指向缩略图的 NSURL 和标题 NSString。
步骤 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];
}
步骤 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];
}
}
这一切都很顺利。令人烦恼的是,该 API 不会返回每张照片的地理位置,因此这需要另一个 API 调用。我想我可以在 FlickrImage 类中执行此操作,但这里变得很难看:
- MainViewController 每次迭代都会创建一个 FlickrImage 实例并将其存储在 NSMutableArray 中。
- FlickrImage 实例异步调用地理定位 Flickr API,并应将返回的坐标存储在适当的成员变量中。
我很确定这不会发生,因为我正在得到
malloc: *** error for object 0x451bc04: incorrect checksum for freed object - object was probably modified after being freed.
散布在我的调试输出中,几乎总是EXC_BAD_ACCESS
但在同一点上不一致。
我显然在这里做了一些根本性错误的事情,但是什么呢?