sexta-feira, 23 de setembro de 2011

Mapa mental (Mind Map) Audio Queue Services


Estou trabalhando em um app para iOS e Mac OS X que envolverá o Core Audio. Como o material é extenso estou colocando tudo em um mapa mental(mind map), feito a partir da documentação da Apple, a maioria dos termos está em inglês mas fica fácil entender, serve como um guia de consulta rápida para saber como se estrutura algumas funções que lidam com audio no Mac/iOS, junto com as imagens, enormes por sinal que estou deixando aqui, disponibilizo também o arquivo do mapa mental que foi feito utilizando o Xmind, excelente software multiplataforma para construção de mapas mentais, assim você poderá acompanhar melhor ou até mesmo editar o mapa mental para inserir ou melhorar detalhes, faça bom proveito.
A medida que eu for criando mais vou disponibilizando aqui.
Esse mapa mental é baseado no Audio Queue Services Programing Guide disponibilizado no site da Apple, é um bom começo para quem pretende gravar ou tocar sons no iOS ou Mac.

Clique para ampliar
Clique para ampliar
 
Clique para ampliar

Clique aqui para fazer baixar o arquivo .xmind do Mapa Mental.
Caso o link acima falhe clique aqui.


quinta-feira, 17 de março de 2011

Tarefas comuns de rede no iOS - Parte 2


Dando proseguimento ao artigo anterior, dessa vez vamos utilizar a classe NSURLConnection, uma classe que lida com conexões assíncronas e ajuda a lidar com timeouts, redirecionamentos e erros. Vamos voltar ao nosso aplicativo anterior.

1. Abra o GetContentWebViewController.h e adicione a seguinte variável de instância que manterá os dados da página web:

NSMutableData * conteudoDados;

2. Em GetContentWebViewController.m troque stringWithContentOfURL por:

conteudoDados = [[NSMutableData alloc] initWithData:nil];

NSURLRequest *req=[[NSURLRequest alloc] initWithURL:url];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];


Nisso inicializamos um objeto que manterá os dados da nossa página web. Criamos um objeto do tipo NSURLRequest para nossa requisição através da do objeto url com nossa endereço e fazemos a conexão usando NSURLConnection que enviará mensagens ao delegador em diversos pontos durante a conexão.


3. Próximo passo é implementar os métodos delegadores.
connection:didReceiveData:
esse método delegador é chamado quando algum dado é recebido e aqui você simplesmente adiciona esses dados nos recebidos previamente.


connection:didFailWithError:
chamado quando ocorre algum error.


connectionDidFinishLoading:
chamdo quando os dados terminam de carregar pela conexão criada, depois disso, aqui você cria por exemplo a string com os dados a serem exibidos em conteudoDados.


Abaixo o código como ficou depois da modificação com os métodos delegadores, repare também no código comentádo:



#import "GetContentWebViewController.h"


@implementation GetContentWebViewController


-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

[conteudoDados appendData:data];
}


-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
UIAlertView *meuAlerta = [[UIAlertView alloc]initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[meuAlerta show];
[meuAlerta release];

}



-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSString *cotacao = [[NSString alloc]initWithBytes:[conteudoDados bytes] length:[conteudoDados length] encoding:NSASCIIStringEncoding];

resultadosView.text = cotacao;
[cotacao release];

}



- (void)viewDidLoad {
NSLog(@"começou");
CGRect resultadoFrame = CGRectMake(10, 10, 300, 100);
resultadosView = [[UITextView alloc] initWithFrame:resultadoFrame];
resultadosView.font = [UIFont systemFontOfSize:14.0];
[self.view addSubview:resultadosView];
NSString *symbol = @"AAPL+GOOG";
NSString *urlString = [NSString stringWithFormat:@"http://finance4444.yahoo.com/d/quotes.csv?s=%@&f=sndlllyr",symbol];
NSURL *url = [NSURL URLWithString:urlString];
//NSString *cotacao = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
conteudoDados = [[NSMutableData alloc] initWithData:nil];
NSURLRequest *req=[[NSURLRequest alloc] initWithURL:url];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
[req release];
[conn release];
//resultadosView.text = cotacao;
    NSLog(@"Terminou");
}




- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}




- (void)dealloc {
[resultadosView release];
[conteudoDados release ];
    [super dealloc];
}

@end


Abaixo screens do app em execução, sem internet, com internet e com a url errada:





quarta-feira, 16 de março de 2011

Tarefas comuns de rede no iOS - Parte 1


Aprenderemos aqui como enviar e receber conteúdo conteúdo de páginas web.
O caminho mais fácil para obter conteúdo HTML de uma página web é usando o método stringWith ContentsOfURL: de NSString.

Obtendo cotações de ações no Yahoo!finance

1. No Xcode, crie uma nova aplicação baseada em visualização e salve como GetContentWeb.

2. Abra o GetContentWebViewController.h, adicione uma variável de instância que será responsável por mostrar o conteúdo obtido:

UITextView *resultadosView;

3. Mude para o GetContentWebViewController.m, e em ViewDidLoad adicione o código abaixo:



CGRect resultadoFrame = CGRectMake(10, 10, 300, 100);

resultadosView = [[UITextView alloc] initWithFrame:resultadoFrame];

resultadosView.font = [UIFont systemFontOfSize:14.0];

[self.view addSubview:resultadosView];

    [super viewDidLoad];



No ViewDidLoad foi criado um UITexView que será usado para mostrar o cotação das ações.

Adicione mais isso em ViewDidLoad:

NSString *symbol = @"AAPL+GOOG";
NSString *urlString = [NSString stringWithFormat:@"http://finance.yahoo.com/d/quotes.csv?s=%@&f=sndlllyr",symbol];

Com esse código criamos uma string que contém o código para a página Yahoo!finance, symbol é usado para armazenar os termos da consulta, em urlString é usado o método stringWithFormat para acrescentar symbol a string de busca.

Adicione mais código abaixo:

NSURL *url = [NSURL URLWithString:urlString];
NSString *cotacao = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
resultadosView.text = cotacao;

Com essa porção de código você cria um objeto NSURL chamado url usando urlString criado anteriormente e com o método após a variável quotes pegamos o resultado formatado em UTF8 e passamos para a string quotes e exibimos esse resultado no nosso rótulo criado lá no início, lembra?

No método dealloc lembre-se de libear a variável alocada para a label:

[resultadosView release];

Abaixo nosso código completo:


#import "GetContentWebViewController.h"

@implementation GetContentWebViewController


- (void)viewDidLoad {
NSLog(@"começou");
CGRect resultadoFrame = CGRectMake(10, 10, 300, 100);
resultadosView = [[UITextView alloc] initWithFrame:resultadoFrame];
resultadosView.font = [UIFont systemFontOfSize:14.0];
[self.view addSubview:resultadosView];
NSString *symbol = @"AAPL+GOOG";
NSString *urlString = [NSString stringWithFormat:@"http://finance.yahoo.com/d/quotes.csv?s=%@&f=sndlllyr",symbol];
NSURL *url = [NSURL URLWithString:urlString];
NSString *cotacao = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
resultadosView.text = cotacao;
    NSLog(@"Terminou");
}




- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}




- (void)dealloc {
[resultadosView release];
    [super dealloc];
}

@end
Repare que no viewDidLoad há o método NSLog tanto no início quanto no fim, isso vai te dar no terminal de Debug uma noção do tempo que leva até o sistema carregar a URL, se experimentar mudar a URL para qualquer coisa estranha verá que ele não fornece erros no terminal.
Apesar de estar usando exemplo do livro tive que pesquisar a URL com os parâmetros necessários para obter dados do Yahoo!finance.
Compile e aparecerá no simulador como abaixo:




terça-feira, 15 de março de 2011

App - Criando uma tabela com três celulas

Nesse artigo mostrarei como criar uma tabela com três celulas, é para usuário mais avançados, vou mostrar somente como posicionar no arquivo xib e o código usado. Irei preencher o conteúdo das céluas usando um array. Usei a documentação da Apple no iOS Dev Center como fonte, vistou eu estar construindo um app e ter surgido essa dúvida.

Abra o Xcode, crie um novo projeto usando o template View-based Application:



Clique no botão Choose... e salve como TabelaExemplo3cell.


Agora dê dois clique em TabelaExemplo3cell.xib para abrir no Interface Builder, verá então nossa TableView aberta, vamos então criar agora três células que serão exibidas por nossa tabela, e cada célula ficará em uma seção.
Na Library procure por Table View Cell e arrasta para a janela onde se pode ver o TableViewController.xib, a janela onde se vê o File's Owner. Arraste três células, ficará como na imagem abaixo:


Dê dois clique na primeira célula e ela aparecerá como abaixo:

Como vê, a célula é uma subclasse de UIView e logo podemos inserir qualquer outro componente nela. Na Library arraste uma Label para a célula e deixe como abaixo, faça o mesmo com as outras duas células só incrementando a numeração:


Aproveite e conecte a tabela com o delegador em File's Owner:


Salve e volte para o Xcode, temos que fazer adições de código nos arquivos.
Em TabelaExemplo3cell.h, o arquivo de cabeçalho deixe o código como abaixo:


#import <UIKit/UIKit.h>

@interface TabelaExemplo3cell : UIViewController<UITableViewDelegate,UITableViewDataSource> {
NSArray *listData;
UITableViewCell *cell0;
UITableViewCell *cell1;
UITableViewCell *cell2;

}
@property(nonatomic,retain) NSArray *listData;
@property(nonatomic,retain)IBOutlet UITableViewCell *cell0;
@property(nonatomic,retain)IBOutlet UITableViewCell *cell1;
@property(nonatomic,retain)IBOutlet UITableViewCell *cell2;

@end

Veja que declarei três propriedades, cada uma representando uma célula, cada célula é um UITableViewCell.

O listData conterá nos nomes das seções.

Volte ao Interface Builder e conecte as saídas a cada uma das células criadas anteriormente.
Salve e volte ao Xcode, agora temos o seguinte código no nosso arquivo :



#import "TabelaExemplo3cell.h"
@implementation TabelaCellViewController
@synthesize listData;@synthesize cell0;@synthesize cell1;@synthesize cell2;


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
NSArray *array = [[NSArray alloc] initWithObjects:@"Seção 1",@"Seção 2",@"Seção 3",nil];self.listData = array;
[array release];
    [super viewDidLoad];}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 3;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 1;

}
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section{
return[listData objectAtIndex:section];
}


-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0) {
return cell0;}
if (indexPath.section == 1) {
return cell1;}
if (indexPath.section == 2) {
return cell2;}


}


-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 70;}


- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

- (void)dealloc {
[cell0 release];[cell1 release];[cell2 release];[listData release];    [super dealloc];
}
@end

No método viewDidLoad preparamos nosso array com os nomes das seções. Alocamos e depois liberamos o objeto.

Em - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { indicamos quantas seções existem, no caso 3.


Em -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ indicamos quantas fileiras existem em cada seção, nesse caso somente 1.


Em -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section{
return[listData objectAtIndex:section];
} passamos para o delegador o título de cada seção, lembra do array que alocamos? Assim a seção que tem indice 0 se chamará Seção 1 e assim por diante dependendo do que colocamos no nosso array.

Em -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPat passamos nossas células criadas no nib, no código que vem abaixo indicamos qual célula irá em cada seção, assim a célula 1 irá na seção 0 e assim por diante.


Com esse método, -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath apenas passo a altura da célula na tabela.

E no final apenas liberamos os objetos alocados.

Compilado nosso app ficará assim:











Conhecendo o básico do Xcode

Decidi iniciar esse blog para concentrar aqui o que vou aprendendo de Objetive-C, Cocoa, podendo assim criar aplicativos tanto para Mac OS quanto para iOS.
Não vou me atentar a história da linguagem ou mesmo a instalação do Xcode, a suite de desenvolvimento para Mac, porque basta uma simples pesquisa na internet para encontrar diversos artigos sobre isso. O que farei aqui será do ponto de vista mais prático, visto eu ter penado bastante para assimilar alguns conceitos.

Pretendo então sempre ir trabalhando com pequenos projetos para mostrar alguns conceitos de Objetive-C e Cocoa para que você possa ir fazendo tudo na prática e assimilando tudo com mais facilidade.
Exemplo, mostro a criação de um pequeno programa, sua execução e a medida que formos construindo eu vou detalhando a funcionalidade do código e o que cada trecho faz, ajudará bastante a aqueles que tem somente uma noção de linguagem de programação.

Então para poder entender melhor os artigos, aconselho que estude pelo menos o básico de Orientação a Objetos e linguagem C, isso não tem como descartar, ajudará muito no aprendizado.
Vou começar agora com algo bem simples no Xcode. Duvidas não deixe de comentar.

Abra o Xcode, depois de instalado lógico, abrirá uma janela de apresentação e clique para criar um novo projeto, teremos então a seguinte janela:


Nessa janela selecionamos um template para poder criar nosso projeto, ao longo de diversos outros artigos vamos experimenta-los. Por hora clique em View-based Application(Aplicação baseada em uma visualização) e em seguida no botão Chose. Na próxima janela digite AppExemplo e escolha local onde seu projeto será salvo. Teremos então a janela do Xcode:



Repare que diversos arquivos são criados, eles serão essenciais quando formos programar diversas funções no nosso aplicativo. Vamos nesse momento apenas onde se constroe a interface dele, expanda a pasta Resources na lista que está no canto superior esquerdo e clique duas vezes em AppExemploViewController.xib, esses arquivos terminados com a extensão .xib são arquivos usado para construir a interface. Será aberto o Interface Builder como mostrado abaixo:


Repare na janela do centro chamada View, nela que construiremos os itens da nossa interface, do lado direito temos a Library que fornece nossos objetos, como botões, campos de texto, tabelas etc. Do lado direito temos o Inpector que permite ajustar diversas funções da nossa interface.  A janela mais abaixo será explanada em outro artigo quando formos inserir mais opções no nosso app.
Vá na Library e clique em Label e arrasta para a janela View, verá que o ponteiro do mouse se modifica com um sinal de mais, solte e verá que aparecerá uns pontos que permitem você ajustar o tamanho da Label, pode move-la também ao longo da View e verá que aparecem umas linhas guias que te permitem posicionar da melhor maneira.
Clique duas vezes na Label e digite qualquer coisa:


Salve  o arquivo e feche o Interface Builder voltando ao Xcode:


No Xcode vamos compilar o nosso projeto, clique no botão Build and Run, um que tem o icone do martelo e abrirá o nosso projeto no simulador assim:

Viu como foi fácil até aqui?
Deixe o projeto salvo. Vamos reutiliza-lo em outros artigos para podermos inserir mais funções e aproveitar e inseri-lo também na programação em Objetive-C.