0

関数が終了するまで戻らないようにしたいのですが、AFHTTPRequestOperation方法がわかりませんでした。よろしくお願いします。

-(BOOL)download
{
BOOL ret = TRUE;
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    ret = [self handle:data];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Failure: %@", error);
}];
[operation start];
return ret ;
}
4

3 に答える 3

2

あなたのデザインは間違っています。

AFHTTPRequestOperationは非同期であるため、同期的に扱うことはできません (また、扱うべきではありません)。の完了ブロックまたは失敗ブロックを使用するには、ワークフローを変更する必要がありますAFHTTPRequestOperation

于 2013-01-27T07:00:17.537 に答える
1

AFNetworking は非同期であるため、これは不可能です。非同期リクエストを使用する場合は、常に成功/終了ブロック内で終了コードを呼び出す必要があります。

ダウンロード方法を使用している場所と、それがいつ終了したかを知る必要がある理由を説明していただければ、説明/より良い設計を支援できます.

于 2013-01-27T06:59:58.550 に答える
0

I would agree with the others above that generally you should stick with AFNetworking Asynchronous nature, but there are ways to cause pseudo synchronous code to run for AFNetworking requests.

Using your example the code below should work.

-(BOOL)download {
    BOOL ret = TRUE;
    __block BOOL complete = NO;
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        ret = [self handle:data];
        complete = YES;
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Failure: %@", error);
        complete = YES;
    }];
    [operation start];

    while(complete == NO) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
    }

    return ret;
}

I have found this kind of usage to be particularly useful with unit testing API's. Nesting can become quite annoying if you have to do API calls just to get to the call you want to test. This is a nifty tool to get around that.

于 2013-02-19T06:43:52.110 に答える