Liberte seu desenvolvedor de aplicativo interno Parte 29: Entendendo os blocos Objective-C

Você tem uma ideia para um aplicativo, mas não tem o conhecimento de programação para começar a construí-lo? Nesta série semanal de blogs, mostrarei a você, que não é programador, passo a passo o processo de criação de aplicativos para iPhone, iPod touch e iPad. Junte-se a mim a cada semana nesta aventura e você experimentará como pode ser divertido transformar suas ideias em realidade! Esta é a parte 29 da série. Se você está apenas começando, confira o início da série aqui .

À medida que continuamos a mover o Revisão do iApps app para a frente, chegamos a um ponto em que temos que escalar a curva de aprendizado em um dos conceitos mais avançados de Objective-C - blocos. Esta discussão vem em um lugar improvável. Esta semana vou mostrar como tirar a imagem de um comentário que você criou no Escrever análise cena e exibi-la no Minhas avaliações cena. Parece que deve ser bastante simples, mas como você verá, envolve o uso da Biblioteca de Ativos do iOS e o uso de blocos Objective-C.



Se você quiser acompanhar, você pode obter a versão mais recente do Revisão do iApps projeto em esse link . Eu recomendo seguir as instruções passo a passo para tirar o máximo proveito deste post, mas se você ficar preso, poderá obter o projeto concluído em esse link . Ao seguir as etapas descritas neste post, você precisará ter uma revisão que contenha uma imagem da biblioteca de fotos do Simulador. Para obter instruções sobre como adicionar imagens à biblioteca de fotos do Simulador, confira minha postagem anterior em esse link .

Salvando uma imagem da biblioteca de fotos no banco de dados

Para refrescar a memória, o Escrever análise cena em Revisão do iApps permite que os usuários selecionem uma imagem da biblioteca de fotos do dispositivo para incluir em sua revisão. Vamos dar uma olhada no código que faz isso acontecer.

  1. Abra o Revisão do iApps projeto em Xcode.
  1. No Project Navigator, selecione o WriteReviewViewController.m arquivo e role para baixo até o acessarPhotoLibrary método mostrado em figura 1 .
  método accessPhotoLibrary
Figura 1 - A acessarPhotoLibrary método exibe o controlador do seletor de imagens

O código neste método cria, configura e exibe um controlador de seletor de imagem que se parece com Figura 2 em tempo de execução.

  tempo de execução do seletor de imagens
Figura 2 - O controlador do selecionador de imagens em tempo de execução
  1. Role até a parte inferior do WriteReviewViewController.m arquivo e você verá o imagePickerController: didFinishPickingMediaWithInfo: método em Figura 3 que são acionados quando o usuário seleciona uma imagem da biblioteca de fotos.
  didFinishPickingMediaWithInfo
Figura 3 - Este método é acionado quando o usuário seleciona uma imagem da biblioteca de fotos.

Este método oculta o controlador do selecionador de imagens, obtém uma referência à imagem selecionada e a armazena no imgThumbnail visualização da imagem. Depois, ele obtém a URL da imagem (a localização da imagem no dispositivo iOS) que é posteriormente armazenada no banco de dados quando a revisão é salva pelo usuário.

Mais tarde, quando abrirmos esta revisão para visualizá-la, precisamos usar o URL da imagem para recuperar a imagem da biblioteca de fotos e exibi-la em uma visualização de imagem. É aqui que nos deparamos com o código 'mais difícil do que você imagina'.

Trabalhando com a Biblioteca de recursos

A recuperação de uma imagem ou vídeo específico da biblioteca de fotos do usuário requer o uso da Biblioteca de ativos do iOS. A documentação da Apple para a Biblioteca de Ativos ( Biblioteca de ALAssets ) tem a dizer:

Uma instância de ALAssetsLibrary fornece acesso aos vídeos e fotos que estão sob o controle do aplicativo Fotos.

A biblioteca inclui aqueles que estão no álbum Fotos Salvas, aqueles vindos do iTunes e aqueles que foram importados diretamente para o dispositivo. Você o usa para recuperar a lista de todos os grupos de ativos e para salvar imagens e vídeos no álbum Fotos salvas.

Portanto, embora usemos a Biblioteca de ativos para recuperar uma foto da biblioteca de fotos, você também pode usá-la para salvar e recuperar vídeos.

Vamos adicionar a Biblioteca de Ativos ao Revisão do iApps projeto.

  1. No Project Navigator, clique no primeiro nó com o ícone azul para exibir o Project Editor no painel central do Xcode.
  1. Role até a parte inferior do Editor de Projetos e sob Estruturas e bibliotecas vinculadas , clique no botão de adição para adicionar uma nova estrutura.
  1. Na caixa de diálogo Escolher Estruturas, selecione AssetsLibrary.framework como mostrado em Figura 4 e, em seguida, clique no Adicionar botão.
  Escolha a estrutura
Figura 4 - Escolha o AssetsLibrary.framework .

Isso adiciona o framework Assets Library abaixo do Project Navigator Estruturas grupo ( Figura 5 ).

  Biblioteca de recursos
Figura 5 - A biblioteca de ativos recém-adicionada

Acessando a Biblioteca de Ativos

Antes de mergulharmos no código, vamos dar uma olhada no panorama geral do que está acontecendo no aplicativo quando um usuário seleciona uma avaliação específica.

Como mostrado em Figura 6 , quando o usuário seleciona uma revisão no Minhas avaliações cena em tempo de execução, o Revisar Entidade associado à linha que eles selecionaram é passado para o Análise da cena ReviewViewController .

  Passar revisãoEntidade
Figura 6 - A Revisar Entidade é passado do Minhas avaliações cena para o Análise cena.

A seguir, o viewDidLoad método no ReviewViewController é acionado e copia os valores do Revisar Entidade objeto para os controles da interface do usuário, conforme mostrado em Figura 7 .

  Atualizar a IU

Figura 7 - Os valores da Revisar Entidade objeto são copiados para os controles da interface do usuário.

Agora vamos adicionar algum código ao projeto que recupera a imagem da Biblioteca de Ativos e, no processo, você entenderá como os blocos funcionam.

  1. No Project Navigator, selecione o ReviewViewController.m Arquivo.
  1. Na parte superior do arquivo de código, adicione o #importar declaração mostrada na parte inferior Figura 8 .
  Importar Biblioteca de Ativos
Figura 8 - Importe a Biblioteca de Ativos.
  1. A seguir, role para baixo até o viewDidLoad e adicione o código mostrado em Figura 9 .
  Obter código da imagem
Figura 9 - O código que obtém uma imagem da Biblioteca de Ativos

As três primeiras linhas de código pré-existentes em viewDidLoad são muito diretos. Eles obtêm os valores de propriedade do selecionado Revisar Entidade ( nome do aplicativo , Avaliação , e comentários ) e armazene-os nos controles da interface do usuário. No entanto, o código para exibir a imagem na visualização da imagem é muito mais complexo, então vamos decompô-lo.

A primeira linha de código que você acabou de adicionar verifica o imagem propriedade do revisãoEntidade objeto. Se não for nada (o que significa que esta revisão tem uma imagem associada a ela), então o E se instrução é executada.

A primeira linha no E se declaração obtém o valor da imagem propriedade no selecionado Revisar Entidade e converte em um NSURL objeto por meio do URLComString: método de classe. A próxima linha de código cria uma instância do Biblioteca de Ativos classe e armazena-o no biblioteca variável. A próxima seção de código mostrada em Figura 10 é onde encontramos blocos Objective-C.

  Código de bloqueio
Figura 10 - A assetForURL chamada de mensagem

Entendendo os Blocos

o assetForURL: método mostrado em Figura 10 aceita três argumentos:

  1. assetForURL - A URL do ativo (neste caso, imagem) que você deseja recuperar da Biblioteca de ativos
  2. resultadoBloco - O bloco de código que você deseja executar se o ativo for encontrado
  3. bloco de falha - O bloco de código que você deseja executar se houver um erro ao recuperar o ativo

Conforme indicado pelo nome dos parâmetros, o assetForURL: espera que você passe blocos Objective-C para o segundo e terceiro parâmetros.

UMA quadra é um pedaço de código autocontido, geralmente pequeno em tamanho que pode ser passado como um objeto. Na verdade, os blocos são objetos em Objective-C. Os blocos são um recurso relativamente novo adicionado no iOS 4.0. Se você vem de outras linguagens de programação, como Ruby ou Python, o conceito de blocos deve ser familiar para você. Se você vem do mundo Microsoft, os blocos são equivalentes a métodos anônimos.

Os blocos podem ser executados:

  1. Como retorno de chamada quando uma operação é concluída ou em resposta à ocorrência de um evento.
  1. Simultaneamente (simultaneamente) em vários segmentos de execução.
  1. Sobre itens em uma coleção

No caso do assetForURL: método, os blocos são executados como um callback quando a operação é finalizada (opção 1).

Vamos dar uma olhada mais de perto na sintaxe do parâmetro de bloco como mostrado em Figura 11 .

  bloqueio de fuga
Figura 11 - O detalhamento de um parâmetro de bloco

Dentro Figura 11 , resultadoBloco: é o nome do parâmetro do bloco. O próprio bloco começa com um caractere de acento circunflexo (^). O bloco aceita ALA ativo parâmetro e o código no bloco é colocado entre chaves.

Para ajudar a entender ainda mais a sintaxe dos blocos, vamos ver como o bloco em Figura 11 é declarado de forma diferente de um método regular. Figura 12 mostra um método em cima e um equivalente quadra no fundo.

  Método vs. Bloco

Figura 12 - Comparando um método a um bloco

Aqui estão algumas coisas a serem observadas:

  • O método no topo especifica um vazio valor de retorno.

O bloco na parte inferior não especifica um valor de retorno. Um bloco posso especifica o tipo de seu valor de retorno, mas não tenho para. O compilador pode examinar o código no bloco e inferir, ou descobrir, o tipo do valor retornado do bloco. Isso é conhecido como tipo de inferência .

  • O nome do método no topo é displayImage: .

Os blocos não têm nomes - eles são anônimo . Na verdade, você pode pensar no caractere til (^) como um espaço reservado para onde você normalmente especificaria um nome de método.

  • O método no topo tem um único parâmetro. Dois pontos separa o nome do método do parâmetro. O tipo de parâmetro ( ALA ativo ) é colocado entre parênteses, seguido pelo nome do parâmetro, de ativos .

Em uma declaração de bloco, não há dois pontos antes do parâmetro e o tipo e o nome do parâmetro são colocados entre parênteses. As vírgulas são usadas para separar vários parâmetros de bloco.

Por que usar blocos?

Então, por que o Cocoa Touch Framework usa blocos em vez de apenas métodos? Existem algumas vantagens em usar blocos:

  1. Eles permitem que você localize o código a ser executado próximo ao código que o está invocando. No exemplo de código em Figura 10 , você não precisa criar um método separado para ser chamado quando o ativo for recuperado. Você pode passar o código como um bloco - é mais direto e mais óbvio o que está acontecendo para alguém que está lendo seu código (depois de entender a sintaxe do bloco).
  1. Os blocos têm acesso a variáveis ​​que estão no escopo no momento em que o bloco é declarado. Isso significa que você não precisa passar argumentos para fornecer as informações de bloco necessárias. Ele pode apenas acessar as variáveis ​​diretamente.

Passando pelo código

Acho que quando estou ensinando aos alunos sobre blocos, é útil definir alguns pontos de interrupção e percorrer o código para ter uma ideia visual de como os blocos são executados.

  1. No ReviewViewController.m arquivo, clique na medianiz à esquerda do código no viewDidLoad método como mostrado em Figura 13 para criar dois pontos de interrupção.
  Pontos de interrupção
Figura 13 - Adicione dois pontos de interrupção ao viewDidLoad método.
  1. Clique no Xcode Corre botão. Quando o aplicativo aparecer no Simulador, selecione o Leia seus comentários opção.
  1. No Minhas avaliações cena, selecione uma revisão que tenha uma imagem associada e você atingirá o primeiro ponto de interrupção, conforme mostrado na Figura 14 .
  Acerte o primeiro ponto de interrupção
Figura 14 - O primeiro breakpoint foi atingido.
  1. A seguir, clique no Entre em botão na parte superior da área Debug, destacado em vermelho em Figura 14 . Você pode se surpreender ao ver que a execução salta para o fundo do E se declaração como mostrado em Figura 15 . O código no bloco ainda não foi executado. Na verdade, se você clicar no botão Entre em botão uma segunda vez, a execução salta para a parte inferior do viewDidLoad método.
  Entre em
Figura 15 - A execução salta para a parte inferior do E se declaração.
  1. Para ver o bloco ser executado, clique no botão Continuar botão (destacado em vermelho em Figura 16 ) e você atingirá o segundo ponto de interrupção. Agora você está executando o código de bloco!
  Acerte o segundo ponto de interrupção
Figura 16 - Executando o código do bloco!
  1. Agora pressione Continuar mais uma vez e você deverá ver a imagem aparecer na visualização da imagem, conforme mostrado em Figura 17 .
  A imagem está na visualização de imagens
Figura 17 - A imagem é exibida na visualização de imagens.

Se você deseja excluir os pontos de interrupção, você pode voltar ao Xcode, clicar com o botão direito do mouse em cada ponto de interrupção e selecionar Excluir ponto de interrupção a partir do menu de atalho.

Conclusão

A sintaxe dos blocos Objective-C pode ser um pouco intimidante no início, mas uma vez que você entenda cada peça e como os blocos são executados, você descobrirá que eles são uma ótima ferramenta que você ficará ansioso para usar. A cada lançamento do Cocoa Touch Framework, a Apple continua a adicionar mais métodos que aceitam parâmetros de bloco, então recomendo ler este post algumas vezes para ter certeza de que você tem uma compreensão sólida dos blocos.

< Próximo>>