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 sendAsynchronousRequest
e NSJSONSerialization JSONObjectWithData
que fará a mágica para você enquanto responde com seu objeto de dados perfeito – ou uma mensagem de erro. Basta criar um NSURLRequest
e passá-lo para JSONFromConnection sendAsynchronousRequest
um 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 NSURLRequestUseProtocolCachePolicy
que 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;
}