サーバーに対して署名付きリクエストを行うアプリケーションがあります。すべての要求には認証トークンが必要です。リクエストを行うたびに、認証トークンが見つからなかった場合は、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];
}
}];