Carregar JSON sem AFNetworking

Se seu aplicativo só precisa carregar alguns arquivos JSON públicos, AFNetworking com CocoaPods não é a solução ágil que você está procurando (adiciona cerca de 600 KB ao seu aplicativo compilado). Então, aqui está um serviço mínimo para ajudá-lo:

Atalho para a essência: https://gist.github.com/widescape/10466762

Use JSONFromConnection

JSONFromConnectioné uma combinação de NSURLConnection sendAsynchronousRequeste NSJSONSerialization JSONObjectWithDataque fará a mágica para você enquanto responde com seu objeto de dados perfeito – ou uma mensagem de erro. Basta criar um NSURLRequeste passá-lo para JSONFromConnection sendAsynchronousRequestum bloco de conclusão.

// YourController.m
- (void)fetchData
{
NSString *urlAsString = [NSString stringWithFormat:@"https://api.example.com/%@/%@", apiKey, yourQuery];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlAsString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20];

__weak
UIViewController *weakSelf = self;
[JSONFromConnection sendAsynchronousRequest:request completeWith:^(id dataFromJSON, NSError *connectionOrJSONError) {
if (connectionOrJSONError) {
// Handle the error
weakSelf
.…
}
else {
// Do something with dataFromJSON (NSMutableData)
weakSelf
.…
}
[weakSelf broadcastWeatherDataFor:index onQueriedLocation:queriedLocation];
}];
}

Nota: A referência weakSelf ajuda a evitar problemas quando seu controlador já foi desalocado quando o bloco é executado.

Configurar JSONFromConnection

Basta copiar os 2 arquivos a seguir em seu projeto. Primeiro JSONFromConnection.h…

// JSONFromConnection.h
#import <Foundation/Foundation.h>

@interface JSONFromConnection : NSObject

+ (void)sendAsynchronousRequest:(NSURLRequest*)request completeWith:(void (^)(id dataFromJSON, NSError *connectionOrJSONError))complete;

@end

… E JSONFromConnection.m.

// JSONFromConnection.m
#import "JSONFromConnection.h"

@implementation JSONFromConnection

+ (void)sendAsynchronousRequest:(NSURLRequest*)request completeWith:(void (^)(id dataFromJSON, NSError *connectionOrJSONError))complete {
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError) {
complete
(nil, connectionError);
}
else {
NSError *jsonError = nil;
NSMutableData *unserializedData = [NSJSONSerialization JSONObjectWithData: data options:NSJSONReadingMutableContainers error:&jsonError];
if (jsonError) {
complete
(data, jsonError);
}
else {
complete
(unserializedData, nil);
}
}
}];
}

@end

Dica: Sempre habilite o cache

No exemplo acima, você notará que a solicitação é criada usando o cachePolicy NSURLRequestUseProtocolCachePolicyque fará uso do cache compartilhado de seus aplicativos. Portanto, certifique-se de configurá-lo:

// AppDelegate.m
#import "AppDelegate.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Setup URL Caching (always a good idea)
NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024
diskCapacity
:20 * 1024 * 1024
diskPath
:nil];
[NSURLCache setSharedURLCache:URLCache];


return YES;
}