У меня возникла определенная проблема с моей реализацией, которую я действительно не знаю, как решить. Могли бы вы, пожалуйста, посоветовать.
Я пытаюсь реализовать класс категории NSManagedObject Photo+Flickr.m с одним методом класса +(void)photoWithFlickrData:inManagedObjectContext:
Я хотел бы загрузить данные из API Flickr с помощью NSURLSessionDownloadTask, а затем создать объект Photo и вставить этот новый созданный объект в базу данных (если его еще нет). Эта часть работает нормально.
И в конце я хотел бы вернуть новый созданный (или объект, который был найден в БД) объект Photo. И тут я сталкиваюсь с проблемой. Поскольку я использую категорию, я не могу использовать переменные экземпляра. Я не могу найти никакого хорошего решения, чтобы получить этот объект Photo из этого блока завершенияHandler.
Мой код:
@implementation Photo (Flickr)
+ (void)photoWithFlickrData:(NSDictionary *)photoDictionary
inManagedObjectContext:(NSManagedObjectContext *)context
{
NSString *placeId = [photoDictionary valueForKeyPath:FLICKR_PHOTO_PLACE_ID];
NSURL *urlInfoAboutPlace = [FlickrFetcher URLforInformationAboutPlace:placeId];
NSURLRequest *request = [NSURLRequest requestWithURL:urlInfoAboutPlace];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
NSURLSessionDownloadTask *task =
[session downloadTaskWithRequest:request
completionHandler:^(NSURL *localfile, NSURLResponse *response, NSError *error) {
if(!error) {
NSData *json = [NSData dataWithContentsOfURL:localfile];
NSDictionary *flickrPlaceDictionary = [NSJSONSerialization JSONObjectWithData:json
options:0
error:NULL];
dispatch_async(dispatch_get_main_queue(), ^{
Photo *photo = nil;
// flickr photo unique id
NSString *uniqueId = [photoDictionary valueForKeyPath:FLICKR_PHOTO_ID];
NSFetchRequest *dbRequest = [NSFetchRequest fetchRequestWithEntityName:@"Photo"];
dbRequest.predicate = [NSPredicate predicateWithFormat:@"uniqueId = %@", uniqueId];
NSError *error;
NSArray *reqResults = [context executeFetchRequest:dbRequest error:&error];
if (!reqResults || error || [reqResults count] > 1) {
//handle error
} else if ([reqResults count]) {
//object found in db
NSLog(@"object found!");
photo = [reqResults firstObject];
} else {
//no object in db so create a new one
NSLog(@"object not found, creating new one");
photo = [NSEntityDescription insertNewObjectForEntityForName:@"Photo"
inManagedObjectContext:context];
//set its properties
photo.uniqueId = uniqueId;
photo.title = [photoDictionary valueForKey:FLICKR_PHOTO_TITLE];
photo.region = [FlickrFetcher extractRegionNameFromPlaceInformation:flickrPlaceDictionary];
NSLog(@"title: %@", photo.title);
NSLog(@"ID: %@", photo.uniqueId);
NSLog(@"region: %@", photo.region);
}
});
}
}];
[task resume];
//how to get Photo *photo object???
//return photo;
}
Я был бы очень признателен за любые предложения о том, как это реализовать.