. Crie o seu próprio serviço web de um aplicativo iOS, parte dois - Tudo Sobre Tecnologia

Essa parcela em nossas iOS detalhes da série de desenvolvimento Como se conectar ao serviço web que você criou e começar a buscar os dados. 
Em uma parte de nossa série sobre como criar o web backend serviço para o aplicativo parte 1, criamos o banco de dados web, a infra-estrutura de serviços web, eo iOS frontend (Storyboard). Agora vamos nos concentrar em conexão com o serviço web e busca de dados reais. Este tutorial vai funcionar no iOS 6 ou 7 iOS.

Passo 4: Obter dados

a. NSURLConnection

Primeiro, vamos adicionar algumas propriedades para a nossa UsersListViewController.m:
@ Interface UsersListViewController () <NSURLConnectionDelegate>
@ Property (não atômica, forte) NSMutableArray * TestArray;
@ Property (não atômica, forte) NSMutableData * buffer;
@ Property (forte, não atômica) IBOutlet UIActivityIndicatorView * giratório;
@ Property (não atômica, forte) NSURLConnection * myConnection;
Nós vamos usar NSURLConnection para criar uma conexão web e buscar dados, então vamos mudar o nosso método viewDidLoad para olhar como este:
- (Void) {viewDidLoad
[Super viewDidLoad];
/ / Animar o spinner
[Self.spinner startAnimating];
/ / Cria o URL e URLRequest
NSURL * myURL = [NSURL URLWithString: @ "http://www.yourserver.com/iglobe/getusers.php"];
NSURLRequest * myRequest = [NSURLRequest requestWithURL: myURL];
/ / Cria a conexão
self.myConnection = [NSURLConnection connectionWithRequest: myRequest delegado: self];
/ / Teste para certificar-se a conexão funcionou
if (self.myConnection) {
self.buffer = [NSMutableData dados];
[Start self.myConnection];
} Else {
NSLog (@ "Falha na conexão");
}
}
Agora NSURLConenction tem quatro métodos delegado você deve implementar. Não se esqueça de adicionar o <NSURLConnectionDelegate> a nossa linha @ interface para UsersListViewController.h (ou m -. Apenas certifique-se que é a interface de linha de @ e não a linha @ implementação). Vamos adicionar o primeiro método:
# Pragma Métodos NSURLConnection
- Ligação (void): (NSURLConnection *) didReceiveResponse conexão: (NSURLResponse *) {resposta
[Self.buffer setlength: 0];
}
Este método é chamado quando o aplicativo recebe uma resposta do servidor. Vamos simplesmente redefinir o tamanho do buffer. Agora, temos de lidar com a cada vez que o aplicativo recebe os dados do servidor:
- Ligação (void): (NSURLConnection *) didReceiveData conexão: (NSData *) Dados {
[Self.buffer appendData: dados];
}
Nós anexar os dados recebidos para os dados do buffer existentes. Vamos lidar com qualquer resposta de erro do servidor, bem como:
- Ligação (void): (NSURLConnection *) didFailWithError conexão: (NSError *) {erro
/ / Faz a limpeza
self.myConnection = nada;
self.buffer = nada;
/ / Informar o usuário, provavelmente em um UIAlert
NSLog (@ "A conexão falhou erro -% @% @",
[LocalizedDescription erro]
[[Erro userInfo] objectForKey: NSURLErrorFailingURLStringErrorKey]);
}
Em seguida, implementar o método que é chamado quando a ligação termina de carregar os dados do servidor web:
- (Void) connectionDidFinishLoading: (NSURLConnection *) conexão {
NSLog (@ "Sucedido!");
/ / Cria uma fila e despachar a análise dos dados
dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ {
/ / Analisar os dados de JSON para um array
NSError * Erro = nil;
NSArray * jsonString = [NSJSONSerialization JSONObjectWithData: opções _buffer: erro NSJSONReadingMutableContainers: & error];
/ / Retornar a principal fila para lidar com os dados e interface do usuário
dispatch_async (dispatch_get_main_queue () ^ {
/ / Verifique se o erro ou não
if (! erro) {
/ / Se não houver erro, então PROCESSO ARRAY
self.testArray = [[NSMutableArray alloc] initWithCapacity: 50];
for (NSDictionary * tempDictionary em jsonString) {/ / Extrair nome de cada dicionário e colocá-lo em nossa gama
[Self.testArray addObject: [tempDictionary objectForKey: @ "username"]];
}
/ / Chama recarga, a fim de atualizar a tableview
[Self.tableView reloadData];
} Else {
NSLog (@ "ERROR% @", [localizedDescription erro]);
}
/ / Parar animar o spinner
[Self.spinner stopAnimating];
/ / Faz a limpeza
self.myConnection = nada;
self.buffer = nada;
});
});
}
A parte importante é que vimos a resposta web registrados no nosso console, assim nós sabemos que é um array. Sabemos também que a matriz tem dicionários em cada índice, portanto, devemos loop ou percorrer cada entrada NSDictionary na matriz e buscar o valor da chave "username" ou objeto. Nós adicionamos o objeto ao nosso self.testArray a cada nova iteração. No final, nós refrescar nossa tableview usar o self.testArray recém-preenchida com os nossos nomes.
Ótimo, então podemos ler as informações de nosso webservice. Como veremos mais tarde, a leitura de dados mais complexos do webservice é apenas uma questão de criar uma string pedido mais complexo do lado do iOS e colocá-lo em conjunto com alguma lógica no lado do servidor php. Esta é uma maneira de buscar dados, usando NSURLConnection diretamente em um viewDidLoad. É melhor do que chamar NSURLConnection no segmento principal, mas queremos ter certeza de nosso código é reutilizável, particularmente a web buscar código, já que é provavelmente código que vai querer usar novamente em futuros projetos. Essa é a razão que criamos a classe SantiappsHelper.
A classe de usuários é um recipiente para os nossos jogadores individuais. Sua interface se parece com isso:
# Importar <Foundation/Foundation.h>
@ Interface de usuários: NSObject {
}
@ Property (não atômica, cópia) NSString * Nome de Usuário;
@ Property (não atômica, cópia) NSString * userPoints;
- (Id) initWithUserName: (NSString *) userPoints Usuário: (NSString *) userPoints;
@ End
e sua implementação muito simples parecido com este:
# Importar "Users.h"
@ Implementação Usuários
- (Id) initWithUserName: (NSString *) nameOfUser userPoints: (NSString *) userPoints;
{
if ((self = [super init]) == nil)
retornar nil;
self.userName = nameOfUser;
self.userPoints = userPoints;
retornar auto;
}
@ End

b. GCD e blocos de conclusão

Queremos fazer o nosso código um pouco mais limpo e mais portátil, nós vamos conseguir isso através da criação de nossa classe SantiappsHelper. Esta classe helper irá concentrar-se em busca de dados a partir da web. É muito semelhante a outros arquivos de classe que você tenha trabalhado antes, mas basicamente ele tem apenas métodos de classes.
# Importar <Foundation/Foundation.h>
# Importar "Tag.h"
typedef void (^ Handler) (NSArray * usuários);
typedef void (^ handler2) (NSArray * pontos);
typedef void (^ Handler3) (NSArray * usersPointsArray);
@ Interface de SantiappsHelper: NSObject {
}
+ (Void) fetchUsersWithCompletionHandler: (Handler) manipulador;
+ (Void) fetchPointForUsersArray: (NSArray *) usersArray WithCompletionHandler: (Handler3) manipulador;
+ (BOOL) postNewTag: (Tag *) passingObject ;/ / para gamebumpconnector
@ End
Estes três métodos de fazer o seguinte: (1) fetchUsersWithCompletionHandler vai buscar a lista de usuários do jogo, (2) fetchPointForUsersArray: WithCompletionHandler: vai buscar os pontos para todos os usuários, e (3) postNewTag irá criar uma nova marca de local para um determinado utilizador.
A idéia é que o usuário vai trocar fichas ou etiquetas com outro usuário. Fisicamente, os dois usuários no mesmo local vai bater telefones para iniciar uma tag vale dois pontos. Como os dados são trocados, cada conta de usuário irá postar uma tag valor de 2 pontos no banco de dados. Originalmente, o jogo foi construído para criar etiquetas individualmente em locais, mas você não pode muito bem chamá-lo de um jogo de tag, se você não marcar um segundo usuário, você pode?
Vamos rever o que esses métodos fazem.
/ / Este método busca ARRAY USUÁRIO
+ (Void) fetchUsersWithCompletionHandler: (Handler) manipulador {
NSString * urlString = [NSString stringWithFormat: @ "http://www.myserver.com/myApp/getusers.php"];
NSURL * url = [NSURL URLWithString: urlString];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL: url cachePolicy: TimeoutInterval NSURLRequestReloadIgnoringLocalAndRemoteCacheData: 10];
[Pedido setHTTPMethod: @ "GET"];
__block NSArray * usersArray = [[NSArray alloc] init];
dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^ {
/ / Peform o pedido
NSURLResponse * resposta;
NSError * Erro = nil;
NSData * receivedData = [NSURLConnection sendSynchronousRequest: pedido
returningResponse: & resposta
erro: e erro];
if (erro) {
/ / Lidar com o erro
if ([isKindOfClass resposta: [NSHTTPURLResponse classe]]) {
NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *) resposta;
NSLog (@ "Erro de HTTP:% d% @", httpResponse.statusCode, erro);
voltar;
}
NSLog (@ "Erro% @", erro);
voltar;
}
NSString * responseString = [[NSString alloc] initWithData: receivedData encoding: NSUTF8StringEncoding];
/ / NSLog (@ "responseString fetchUsers% @", responseString);
usersArray = [NSJSONSerialization JSONObjectWithData: [responseString dataUsingEncoding: NSASCIIStringEncoding] Opções: 0 erros: nil];
/ / Retorna manipulador
if (handler) {
dispatch_async (dispatch_get_main_queue () ^ {
handler (usersArray);
});
}
});
}
/ / Obtém pontos por série usuários
+ (Void) fetchPointForUsersArray: (NSArray *) usersArray WithCompletionHandler: (Handler3) manipulador {
NSError * Erro = nil;
NSData * data = [NSJSONSerialization dataWithJSONObject: opções usersArray: 0 erro: e erro];
(erro) se
NSLog (@ "% s: JSON erro:% @", __ FUNCTION__, erro);
/ / Cria o pedido
NSURL * url = [NSURL URLWithString: @ "http://www.myserver.com/myApp/readpointsforarray.php"];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL: url];
[Pedido setHTTPMethod: @ "POST"];
[Pedido setValue: @ "application / json; charset = UTF-8" forHTTPHeaderField: @ "Content-Type"];
[Pedido setHTTPBody: dados];
__block NSArray * pointsArray = [[NSArray alloc] init];
dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^ {
/ / Peform o pedido
NSURLResponse * resposta;
NSError * Erro = nil;
/ / Emitir o pedido
NSData * returnData = [NSURLConnection sendSynchronousRequest: pedido returningResponse: & erro de resposta: & error];
if (erro) {
/ / Lidar com o erro
if ([isKindOfClass resposta: [NSHTTPURLResponse classe]]) {
NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *) resposta;
NSLog (@ "Erro de HTTP:% d% @", httpResponse.statusCode, erro);
/ / Retorno;
}
NSLog (@ "Erro% @", erro);
/ / Retorno;
}
NSString * responseString = [[NSString alloc] initWithData: returnData encoding: NSUTF8StringEncoding];
/ / NSLog (@ "modo assíncrono:% @", responseString);
pointsArray = [NSJSONSerialization JSONObjectWithData: [responseString dataUsingEncoding: NSASCIIStringEncoding] Opções: 0 erros: nil];
/ / NSLog (@ "pointsArray% @", pointsArray);
if (handler) {
dispatch_async (dispatch_get_main_queue () ^ {
handler (pointsArray);
});
}
});
}
/ / Chamado de MKViewController, cria pontos de marcas compartilhadas = 2
+ (BOOL) postNewTag: (Tag *) passingObject {
/ / 1. Acesse o tag para verificação primeiro
NSLog (@ "passingObject:% @,% @,% @,% @,% @", passingObject.sender, passingObject.receiver, passingObject.rglatitude, passingObject.rglongitude, passingObject.rgcountry);
/ / NSLog (@ "tagReceived:% @,% @,% @,% @", tagReceived.originUdid, tagReceived.destintyUdid, tagReceived.rglatitude, tagReceived.rglongitude);
/ String / status 2.REBUILD de passingObject
NSString * s1 = [[NSString alloc]
/ / 3. Publicar tag para cloud
NSData * postData = [s1 dataUsingEncoding: NSUTF8StringEncoding allowLossyConversion: YES];
NSString * postLength = [NSString stringWithFormat: @ "% d", [postData comprimento]];
NSMutableURLRequest * request = [[[NSMutableURLRequest alloc] init] autorelease];
NSURL * url = [NSURL URLWithString: [NSString stringWithFormat: @ "http://www.myserver.com/myApp/writephp.php"]];
[Pedido setURL: url];
[Pedido setHTTPMethod: @ "POST"];
[Pedido setValue: postLength forHTTPHeaderField: @ "Content-Length"];
[Pedido setValue: @ "application / x-www-form-urlencoded x" forHTTPHeaderField: @ "Content-Type"];
[Pedido setHTTPBody: postData];
NSURLResponse * resposta;
NSError * erro;
/ / Nós provavelmente deve ser analisar os dados retornados por este convite, pois agora basta verificar o erro.
[NSURLConnection sendSynchronousRequest: pedido returningResponse: & erro de resposta: & error];
NSLog (@ "sucesso!");
[Release s1];
retorno (erro == nil);
}
fetchUsersWithCompletionHandler:
No início de nossa classe helper, definimos três TYPEDEFs, isto significa apenas que estamos definindo um tipo, que chamamos Handler. Vamos ver em um minuto o que estes são usados.Basicamente, esse método cria um pedido tipo GET, que será usado para obter os nossos utilizadores do serviço web que criamos. Ele cria uma matriz bloco para ser usado dentro do bloco para armazenar nossos dados retornados. Antes de executar o bloco (que contém a chamada de método NSURLConnection), que enviará a operação para a fila de fundo e executá-lo lá. Isso significa que um servidor lento ou ocupado não vai bloquear nosso segmento principal. A thread principal é responsável pelas operações e interação do usuário desenho. Se uma operação de veículos pesados, tais como buscar dados de um servidor web ou imagens e vídeo de processamento eram para ser executado no thread principal, o usuário não seria capaz de interagir com o aplicativo até que a tarefa estava completa.
O manipulador é o typedef que é criado quando o método foi concluído e, portanto, vamos verificar para ver se ele existe. Uma vez que não existe, nós o chamamos de volta para o segmento principal, retornando o usersArray agora preenchida. Isso usersArray serão usados ​​para preencher a lista de utilizadores no nosso tableview.
fetchPointForUsersArray: WithCompletionHandler
Este método é responsável por enviar em uma variedade de usuários e buscar os seus pontos de volta. Ele fala para o último arquivo php que criamos e retorna o usersArray, que contém um dicionário com os usuários e seus pontos.
postNewTag
O método final é encarregado de registrar uma marca recém-criada e, em seguida, postá-lo no banco de dados.
Temos um método de gravação de dados no banco de dados (postNewTag) e dois métodos para leitura de dados a partir do banco de dados (fetchUsers ... e fetchPointForUsersArray ...).Lemos e escrevemos pontos (ou tags) e leia usuários. Nós temos que ter uma maneira de escrever os usuários, nós vamos cobrir mais tarde em uma classe chamada ModalViewController, que vai aceitar um login de um usuário para criar um novo usuário. 
Antes de bater telefones e taxas de etiquetas que devem ser capazes de criar marcas, por isso vamos criar uma classe Tag e sua ViewController e traçar-los no mapa. Assim que tivermos isso, vamos salvar o nosso informações do usuário para a nossa aplicação e estar pronto para bater.
 Autor:

Sobre Marcio Valenzuela

Meu nome é Marcio Valenzuela e eu sou de Honduras. Fui codificação em iOS para 5 anos e já trabalhou em aplicações web em ASP e PHP / MySQL. Eu tenho alguns aplicativos se na app store e estou trabalhando atualmente em um par de jogos Cocos2D ...

0 comentários Goocle+ 0 Facebook

Postar um comentário

 
Tudo Sobre Tecnologia © 2013-2020. Todos os direitos reservados. Tudo Sobre Tecnologia. Desenvolvido por TST
Topo