2

サーバーに対して署名付きリクエストを行うアプリケーションがあります。すべての要求には認証トークンが必要です。リクエストを行うたびに、認証トークンが見つからなかった場合は、NSInvocation を使用してそのリクエストを保存し、認証トークンをクエリして呼び出しを呼び出し、完了ブロックを使用して元の呼び出しメソッドに戻ります。

私の質問は、return ブロックを 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];
        }
    }];
4

0 に答える 0