Todd Horst
Todd Horst

Reputation: 863

AFNetworking 2 setImageWithURL custom response type image/jpeg

Im using AFNetworking 2. I have a UITableview and each row contains an image.

The issue is that the response type is image/pjpeg which is not an accepted type by default. To get around this I have modified AFURLResponseSerialization.m around line 599. Adding this content type to the end of the self.acceptableContentTypes declaration.

I would prefer not to modify the source. Is there a proper way to do this in 2.x?

NSString *url = [NSString stringWithFormat:@"%@my/images/%@",BaseUrl,[o objectForKey:@"ID"]];
[cell.imageView setImageWithURL:[NSURL URLWithString:url]
               placeholderImage:[UIImage imageNamed:@"placeholder"]
 ];

This no longer seems to work:

[AFImageRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"image/jpeg"]]

Update:

I can see the error using the following code:

   NSURLRequest *urlRequest = [NSURLRequest requestWithURL: [NSURL URLWithString: url]];

__weak UITableViewCell *weakCell = cell;
[cell.imageView setImageWithURLRequest:urlRequest
                      placeholderImage:[UIImage imageNamed:@"placeholder"]
                        success: ^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {

                            __strong UITableViewCell *strongCell = weakCell;

                            strongCell.imageView.image = image;

                            [tableView reloadRowsAtIndexPaths: @[indexPath]
                                             withRowAnimation: UITableViewRowAnimationNone];
                            NSLog(@"Your image request succeeded!");
                        } failure: ^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                            NSLog(@"Your image request failed...");

                            NSLog(@"Error: %@", error);
                            NSLog(@"Error: %@", response);
                        }

 ];

Here is the error:

Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: image/pjpeg"

Upvotes: 5

Views: 5694

Answers (4)

sschmitz
sschmitz

Reputation: 442

For those using AFNetworking 3.0, you can simply update responseSerializer on the shared sessionManager.

AFImageResponseSerializer* serializer = (AFImageResponseSerializer*)      [UIImageView sharedImageDownloader].sessionManager.responseSerializer;
serializer.acceptableContentTypes = [serializer.acceptableContentTypes setByAddingObject:@"image/jpg"];

Upvotes: 2

pg2012
pg2012

Reputation: 11

if you are using RestKit or AFNetworking 1.3 use

[AFImageRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"image/pjpeg"]];

Upvotes: 1

coverback
coverback

Reputation: 4413

I found a way to set accepted MIME types once for image serialisation, albeit it is a bit hacky. UIImageView+AFNetworking provides users with a default AFImageResponseSerializer, and it turns out the default instance is shared across all UIImageView instances, unless a custom serialiser was set.

Executing this code at app launch will modify default behaviour of all image views:

AFImageResponseSerializer *serializer =
    [[[UIImageView alloc] init] imageResponseSerializer];
NSSet *mimeTypes = [serializer.acceptableContentTypes 
    setByAddingObjectsFromArray:@[@"image/pjpeg", @"image/x-png"]];
[serializer setAcceptableContentTypes:mimeTypes];

This approach works perfectly for me, but beware that this doesn't rely on any public contract and may change in future versions. If you choose to use this, cover this with unit tests which ensure that instance is indeed shared.

The approach will also break if you execute something like

imageView.imageResponseSerializer = [[AFImageResponseSerializer alloc] init];

as it will replace the shared instance with the unmodified default behaviour.

Upvotes: 2

David Snabel-Caunt
David Snabel-Caunt

Reputation: 58361

You can set your own imageResponseSerializer on a UIImageView instance:

AFImageResponseSerializer *serializer = [[AFImageResponseSerializer alloc] init];
serializer.acceptableContentTypes = [serializer.acceptableContentTypes setByAddingObject:@"image/pjpeg"];
cell.imageView.imageResponseSerializer = serializer;

NSString *url = [NSString stringWithFormat:@"%@my/images/%@",BaseUrl,[o objectForKey:@"ID"]];
[cell.imageView setImageWithURL:[NSURL URLWithString:url]
               placeholderImage:[UIImage imageNamed:@"placeholder"]
];

Upvotes: 13

Related Questions