Como posso passar um Block
para um Function
/ Method
?
Eu tentei - (void)someFunc:(__Block)someBlock
sem sucesso.
ie Qual é o tipo de a Block
?
objective-c
objective-c-blocks
Jacksonkr
fonte
fonte
Respostas:
O tipo de um bloco varia de acordo com seus argumentos e seu tipo de retorno. No caso geral, os tipos de bloco são declarados da mesma maneira que os tipos de ponteiros de função, mas substituindo o
*
por a^
. Uma maneira de passar um bloco para um método é a seguinte:Mas como você pode ver, isso é confuso. Você pode usar um
typedef
para tornar os tipos de bloco mais limpos:E então passe esse bloco para um método como este:
fonte
NSNumber *
oustd::string&
ou qualquer outra coisa que você poderia passar como argumento de função. Este é apenas um exemplo. (Para um bloco que é equivalente, exceto para a substituiçãoid
comNSNumber
otypedef
seriatypedef void (^ IteratorWithNumberBlock)(NSNumber *, int);
.)NS_NOESCAPE
, masenumerateObjectsUsingBlock
me disseram que não é escapável, mas não vejoNS_NOESCAPE
nenhum lugar no site, nem o escape mencionado nos documentos da Apple. Você pode ajudar?A explicação mais fácil para esta pergunta é seguir estes modelos:
1. Bloquear como parâmetro de método
Modelo
Exemplo
Outro uso de casos:
2. Bloquear como uma propriedade
Modelo
Exemplo
3. Bloquear como argumento de método
Modelo
Exemplo
4. Bloquear como uma variável local
Modelo
Exemplo
5. Bloquear como um typedef
Modelo
Exemplo
fonte
Isso pode ser útil:
fonte
Você pode fazer assim, passando o bloco como um parâmetro do bloco:
fonte
Mais uma maneira de passar o bloco usando as funções ñ no exemplo abaixo. Eu criei funções para executar qualquer coisa em segundo plano e na fila principal.
arquivo blocks.h
arquivo blocks.m
Em seguida, importe blocks.h quando necessário e chame-o:
fonte
Você também pode definir o bloco como uma propriedade simples, se aplicável:
verifique se a propriedade do bloco é "cópia"!
e é claro que você também pode usar o typedef:
fonte
Além disso, você invoca ou chama um bloco usando a sintaxe usual da função c
Mais informações sobre blocos aqui
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW1
fonte
Costumo sempre esquecer a sintaxe dos blocos. Isso sempre vem à minha mente quando preciso declarar um bloqueio. Eu espero que isso ajude alguém :)
http://fuckingblocksyntax.com
fonte
Escrevi um completeBlock para uma classe que retornará os valores dos dados depois que eles foram sacudidos:
Defina typedef com returnType ( declaração
.h
acima@interface
)Defina a
@property
para o bloco (.h
)Defina um método com
finishBlock
(.h
)Insira o método definido anterior no
.m
arquivo e confirmefinishBlock
com o@property
definido antesPara acionar a
completionBlock
passagem de typeType predefinido (não se esqueça de verificar secompletionBlock
existe)fonte
Apesar das respostas dadas neste tópico, eu realmente lutei para escrever uma função que levaria um bloco como uma função - e com um parâmetro. Eventualmente, aqui está a solução que eu encontrei.
Eu queria escrever uma função genérica
loadJSONthread
, que pegasse a URL de um serviço da Web JSON, carregasse alguns dados JSON dessa URL em um encadeamento em segundo plano e retornasse um NSArray * dos resultados de volta à função de chamada.Basicamente, eu queria manter toda a complexidade do thread em segundo plano escondida em uma função reutilizável genérica.
Aqui está como eu chamaria essa função:
... e foi com isso que lutei: como declará-lo e como fazê-lo chamar a função Block depois que os dados foram carregados e passar o
Block
NSArray * dos registros carregados:Esta questão StackOverflow se refere a como chamar funções, passando um bloco como parâmetro, então simplifiquei o código acima e não incluí a
loadJSONDataFromURL
função.Mas, se você estiver interessado, poderá encontrar uma cópia dessa função de carregamento JSON neste blog: http://mikesknowledgebase.azurewebsites.net/pages/Services/WebServices-Page6.htm
Espero que isso ajude outros desenvolvedores de XCode! (Não esqueça de votar nesta pergunta e na minha resposta, se houver!)
fonte
O modelo completo parece
fonte