Как вы передаете блок завершения, используя NSInvocations?
У меня есть приложение, которое делает подписанные запросы на мой сервер. Все запросы требуют токен аутентификации. Когда бы я ни делал запрос, если токен аутентификации не был найден, я сохраняю этот запрос, используя NSInvocation, запрашиваю токен аутентификации, вызываю мой вызов, затем возвращаюсь к исходному вызывающему методу с блоком завершения.
Мой вопрос: как правильно передать блок возврата в NSInvocation? У меня нет ошибок, но по какой-то причине оригинальный вызывающий блок завершения [someClass listFilesWithCompletionBlock] никогда не срабатывает.
...
[someClass listFilesWithCompletionBlock:^(id response, id error){
onCompletion(response, error); // <-- never returns here
}];
...
// someClass
// method that is called if token was valid
- (void) someMethodWithCompletionBlock:(void(^)(id response, id error))onCompletion{
// do the work that lists all of the files from server
onCompletion(response, error);
}
// if token was valid, call someMethod, if not then set the invocation, then call fetch token
- (void) listFilesWithCompletionBlock:(void(^)(id response, id error))onCompletion{
onCompletion(response, error){
if(token){
[self someMethodWithCompletionBlock:^(id response, id error){
onCompletion(response, error);
}];
}else{
void (^blockName)(id, id) = ^void (id response, id error){
NSLog(@"block!");
};
SEL selector = @selector(listFilesWithCompletionBlock:);
NSMethodSignature *signature = [self methodSignatureForSelector:selector];
self.invocation = [NSInvocation invocationWithMethodSignature:signature];
[self.invocation setTarget:self];
[self.invocation setSelector:selector];
[self.invocation setArgument:&blockName atIndex:2];
[self fetchToken];
}
}
// fetches token, then invokes
- (void) fetchToken{
[anotherClass fetchTokenWithCompletionBlock:^(NSString *responseToken, id error) {
if(responseToken){
// we got the token
// invoke any methods here
// should call listFiles with valid token then calls someMethod
[self.invocation invoke];
}
}];