Como usar objetos de bloco em seu aplicativo ios

blocos de Objective-C são como funções tradicionais C em que os blocos são unidades pequenas, independentes de código em seu aplicativo iOS. Eles podem ser passados ​​como argumentos de métodos e funções e, em seguida, usado quando eles são necessários para fazer algum trabalho. (Como muitos tópicos de programação, entendendo objetos bloco é mais fácil quando você usá-los.)

Com iOS 4 e versões mais recentes, um número de métodos e funções das estruturas de sistemas estão a começar a ter como blocos de parâmetros, incluindo o seguinte:

  • manipuladores de conclusão

  • manipuladores de notificação

  • manipuladores de erro

  • Enumeração

  • Ver animação e transições

  • classificando

Aqui, você começa a usar um método baseado em bloco para animar um carro, mas os objetos do bloco também têm um número de outros usos, especialmente em Grand Central Dispatch eo NSOperationQueue classe, as duas tecnologias recomendadas para processamento simultâneo. Sinta-se livre para verificar o processamento simultâneo.

Um dos valores de uso de blocos é que você pode acessar as variáveis ​​locais (assim como variáveis ​​de instância), que você não pode fazer em uma função ou uma chamada de retorno. Você também não tem que passar dados ao redor - um bloco pode modificar variáveis ​​para transmitir dados de volta. Além disso, se você precisa mudar alguma coisa, não há nenhuma API para mudar, com o seu efeito cascata concomitante.

Às vezes é mais fácil de seguir o que está acontecendo, declarando uma variável de bloco e de passagem, que como o argumento para o método. A sintaxe de declaração, no entanto, é semelhante à sintaxe padrão para ponteiros de função, exceto que você use um acento circunflexo (^) em vez de um ponteiro de asterisco (*).

Se você olhar para animateWithDuration: animações: conclusão: no UIView referência de classe, você verá

+ (Void) animateWithDuration: (NSTimeInterval) durationanimations: (nulos (^) (nulo)) animationscompletion: (vazio (^) (BOOL terminado)) completion-

A Apple está agora tratando blocos como um padrão de design primário, lá em cima com a herança e delegação - por isso não se surpreenda ao encontrar blocos sendo usado cada vez mais.

No entanto, porque é um pouco avançado, o código é investigado em profundidade para que você vai ser confortável com blocos, apesar da sintaxe muito estranho.

Para começar, esta é a sintaxe que define animações como um bloco que não tem parâmetros e nenhum valor de retorno:

void (^) (nulos)) animações


realização é definido como um bloco que não tem valor de retorno e usa um único parâmetro argumento booleano:

 (Void (^) (BOOL terminado)) conclusão

Quando você cria um bloco alinhado, basta usar o operador acento circunflexo (^) para indicar o início de um bloco e depois seguir com o código fechado dentro das chaves normais. Isso é o que estava acontecendo com

animações: ^ {self.car.center = centro-}

e

conclusão: ^ (BOOL terminado) {[auto rodar] -}

Embora neste exemplo, você usar blocos em linha, você também pode declará-los como qualquer outra variável local. Adicione o código em negrito para o seu testDrive Método substituindo o que você já tem nesse ponto.

- (IBAction) TestDrive: (ID) remetente {centro CGPoint = CGPointMake (car.center.x, self.view.frame.origin.y + car.frame.size.height / 2) - vazio (^ Animação) () = ^ () {self.car.center = centro-} -vazio (^ Conclusão) (BOOL) = ^ (BOOL terminado){[Auto rotate] -} -[UIView animateWithDuration: 3 animações: animação conclusão: conclusão] -}

Quando você declarar um bloco, você usar o operador acento circunflexo (^) para indicar o início de um bloco com o código fechado dentro das chaves normais, e um ponto e vírgula para indicar o fim de uma expressão bloco.

A declaração na listagem 10-2 é praticamente o mesmo que você vê na seguinte animateWithDuration: animações: conclusão: declaração de método, exceto que os identificadores foram movidos em torno de um pouco. Ambos estão em negrito para tornar isso um pouco mais fácil de ver:

+ (void) animateWithDuration: (NSTimeInterval) durationanimations :(void (^) (void))animationscompletion :(vazio (^) (BOOL terminado)) completion-

Aqui, você está declarando duas variáveis ​​bloco usando o ^ operador: uma com o nome de animações que não tem valor de retorno, e uma com o nome de realização que não tem valor de retorno e leva BOOL como seu único argumento:

vazio (^ animação) () vazio (^ conclusão) (BOOL)

Isto é como qualquer outra declaração de variável (int i = 1, por exemplo), em que você siga o sinal de igualdade com a sua definição.

Você usa o ^ operador novamente para indicar o início do bloco literal - a definição atribuída à variável bloco. O bloco literal inclui nomes de argumentos (acabado), Bem como o corpo (código) do bloco e é terminada com um ponto e vírgula:

vazio (^ Animação) () = ^ () {Self.car.center = center -} -vazio (^ Conclusão) (BOOL) = ^ (BOOL terminado){[Auto girar] -} -

Depois de fazer pegar o jeito de blocos, você vai encontrar todos os tipos de oportunidades para usá-los para simplificar o seu código.


Publicações relacionadas