Как вы передаете блок завершения, используя 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];
        }
    }];

0 ответов

Другие вопросы по тегам