2013-06-10 2 views
1

У меня возникают проблемы с отображением изображений из Yummly API с использованием AFNetworking. Проблема в том, что некоторые значения не имеют URL-адреса? Кто-нибудь с идеями?AFNetworking - setImageWithURL, не отображающий изображение

Последняя строка в методе - это вопрос, о котором идет речь.

- (void)configureForSearchResult:(SearchResult *)searchResult 
{ 
    self.recipeNameLabel.text = searchResult.recipeName; 
    self.ratingLabel.text = searchResult.rating; 
    [self.snapImageView setImageWithURL:[NSURL URLWithString:searchResult.image] placeholderImage: [UIImage imageNamed:@"Placeholder"]]; 
} 

Это, как я разборе:

- (SearchResult *)parseRecipe:(NSDictionary *)dictionary 
{ 
    SearchResult *searchResult = [[SearchResult alloc] init]; 

    searchResult.recipeName = [dictionary objectForKey:@"recipeName"]; 
    searchResult.rating = [NSString stringWithFormat:@"%@", [dictionary objectForKey:@"rating"]]; 
    searchResult.image = [NSString stringWithFormat:@"%@",[dictionary objectForKey:@"smallImageUrls"]]; 

    NSLog(@"%@", searchResult.image); 

    return searchResult; 
} 

Это то, что я получаю от API в результате NSLog выше:

2013-06-09 22 : 06: 19,268 Yummly [90606: 11303] ("http://i.yummly.com/Game-day-bbq-chicken-mini-pizzas-310087-274540.s.jpg" )

2013-06-09 22: 06: 19,268 Yummly [90606: 11303] ( )

2013-06-09 22: 06: 19,271 Yummly [90606: 11303] ( "http://i.yummly.com/Buffalo-Chicken-Pizza-Food-Network-2.s.jpg" )

2013-06-09 22: 06: 19,273 Yummly [90606: 11303] ( )

2013-06-09 22: 06: 19,275 Yummly [90606: 11303] ( "http://i.yummly.com/Julia-child_s-eggplant-pizzas-_tranches-d_aubergine-a-l_italienne_-309207-273660.s.jpg" )

Вот пример возвращаемого JSON:

{ 
    "attribution": { 
    "html": "<a href='http:\/\/www.yummly.com\/recipes\/pizza'>pizza recipes<\/a> search powered by <img alt='Yummly' src='http:\/\/static.yummly.com\/api-logo.png'\/>", 
    "url": "http:\/\/www.yummly.com\/recipes\/pizza", 
    "text": "pizza recipes: search powered by Yummly", 
    "logo": "http:\/\/static.yummly.com\/api-logo.png" 
    }, 
    "totalMatchCount": 8591, 
    "facetCounts": { 

    }, 
    "matches": [ 
    { 
     "attributes": { 
     "course": [ 
      "Main Dishes", 
      "Appetizers", 
      "Lunch and Snacks" 
     ], 
     "cuisine": [ 
      "Mediterranean", 
      "Greek" 
     ] 
     }, 
     "flavors": null, 
     "rating": 5, 
     "id": "Greek-pizza-333514", 
     "smallImageUrls": [ 
     "http:\/\/i.yummly.com\/Greek-pizza-333514-295434.s.jpg" 
     ], 
     "sourceDisplayName": "How Sweet It Is", 
     "totalTimeInSeconds": null, 
     "ingredients": [ 
     "red onion", 
     "olive oil", 
     "pizza doughs", 
     "artichoke hearts", 
     "roasted red pepper", 
     "kalamata olives", 
     "feta", 
     "garlic cloves", 
     "fresh dill", 
     "tomatoes", 
     "mozzarella cheese" 
     ], 
     "recipeName": "Greek Pizza" 
    }, 
    { 
     "attributes": { 

     }, 
     "flavors": { 
     "salty": 0.66666666666667, 
     "sour": 0.5, 
     "sweet": 0.16666666666667, 
     "bitter": 0.5, 
     "meaty": 0.83333333333333, 
     "piquant": 0 
     }, 
     "rating": 5, 
     "id": "Breakfast-pizza-305693", 
     "smallImageUrls": [ 
     "http:\/\/i.yummly.com\/Breakfast-pizza-305693-270301.s.jpg" 
     ], 
     "sourceDisplayName": "Smitten Kitchen", 
     "totalTimeInSeconds": null, 
     "ingredients": [ 
     "shallot", 
     "large eggs", 
     "bacon", 
     "ground black pepper", 
     "parmesan", 
     "flat-leaf parsley", 
     "yeast", 
     "kosher salt", 
     "scallions", 
     "bread flour", 
     "mozzarella", 
     "chives" 
     ], 
     "recipeName": "Breakfast Pizza" 
    }, 
    { 
     "attributes": { 

     }, 
     "flavors": null, 
     "rating": 4, 
     "id": "Mini-Deep-Dish-Pizzas-Martha-Stewart-191946", 
     "smallImageUrls": [ 
     "http:\/\/i.yummly.com\/Mini-Deep-Dish-Pizzas-Martha-Stewart-191946-104372.s.png" 
     ], 
     "sourceDisplayName": "Martha Stewart", 
     "totalTimeInSeconds": 1800, 
     "ingredients": [ 
     "coarse salt", 
     "olive oil", 
     "ground pepper", 
     "vegetables", 
     "tomato", 
     "all-purpose flour", 
     "pizza doughs", 
     "shredded mozzarella" 
     ], 
+0

если URL представляет то изображение отображения? –

+0

Включите ссылку api, которую вы используете –

ответ

0

Ваш ответ JSON для ключевых "smallImageUrls"

"smallImageUrls": ["http:\/\/i.yummly.com\/Breakfast-pizza-305693-270301.s.jpg"] 

это не строка, поэтому используйте

searchResult.image = [NSString stringWithFormat:@"%@",[[dictionary objectForKey:@"smallImageUrls"] objectAtIndex:0]]; 

// [] - it represents array in response 
+1

Просто имейте в виду, что если по какой-либо причине массив пуст, этот код приведет к краху вашего приложения. – rckoenes

0

URL-адрес в какао используется как альтернатива путям, поэтому вы можете использовать только URL-адреса файлов. Если вы хотите отображать данные из удаленного источника, вам необходимо загрузить его из источника, используя NSURLConnection, NSURLRequest, а затем либо преобразовать данные в UIImage, либо сохранить их на диск, а использовать URL-адрес файла для локальной копии изображения.

+0

Спасибо, я сделаю это. Я действительно хотел попробовать методы AFNetworking из коробки. – Will

0

В вашем коде нет ничего плохого. Проблема в том, что веб-сервис не перенастраивает все изображения. setImageWithURL: placeholderImage: является прекрасным peice кода, который будет загружать изображения асинхронно с AFNetworking

0

Вероятно, некоторые изображения пустые, поэтому вы можете выбрать использование образа заполнителя. Также смотрите кодировку изображения, будь то кодировка base64. Если это необходимо, используйте этот код и замените его на свой.

NSString *base64StringEncoder = @"data:image/png;base64,"; 
    base64StringEncoder = [base64StringEncoder stringByAppendingString:[[presentationArray objectAtIndex:indexPath.row]valueForKey:@"profile_image"]]; 

    NSURL *profilePicURL = [NSURL URLWithString:base64StringEncoder]; 
    NSData *profilePicimageData = [NSData dataWithContentsOfURL:profilePicURL]; 
    if (profilePicimageData.length!=0) { 
     cell.imgView.image = [UIImage imageWithData:profilePicimageData]; 
    } 
+0

Это состязание, не относящееся к вопросу. – rckoenes

0

Проблема заключается в том, что Objective-C не будет автоматически кодировать вашу строку. Ваш URL содержит символы, которые должны быть закодированы. Посмотрите на NSURL Encoding in ObjC.

0

Проблема с вашим синтаксическим кодом, вы пытаетесь проанализировать массив в строке.

- (SearchResult *)parseRecipe:(NSDictionary *)dictionary 
{ 
    SearchResult *searchResult = [[SearchResult alloc] init]; 

    searchResult.recipeName = [dictionary objectForKey:@"recipeName"]; 
    // You should just store the rating as a NSNumber since that is what it is. 
    searchResult.rating = [NSString stringWithFormat:@"%@", [dictionary objectForKey:@"rating"]]; 

    NSArray *imageArray = [dictionary objectForKey:@"smallImageUrls"]; 
    if ([imageArray count] > 0) { 
     searchResult.image = [imageArray objectAtIndex:0]; 
    } 

    return searchResult; 
} 

Тогда как раз перед вашей попробовать и установить контроль изображения, если у вас есть изображение:

- (void)configureForSearchResult:(SearchResult *)searchResult 
{ 
    if (!searchResult.image) { 
     return; 
    } 

    self.recipeNameLabel.text = searchResult.recipeName; 
    self.ratingLabel.text = searchResult.rating; 
    [self.snapImageView setImageWithURL:[NSURL URLWithString:searchResult.image] placeholderImage: [UIImage imageNamed:@"Placeholder"]]; 
} 
Смежные вопросы