由于不幸地停止了ASIHTTP项目的工作,以及后来发现AFNetworking代码库更好、更小,因此我正在将我的应用程序例程从ASIHTTP转换为AFNetworking。
但我遇到了几个问题。我的ASIHTTPRequest代码是作为一个方法构建的。这个方法需要一些参数,并将这些参数发布到一个URL上...然后返回结果数据。这些数据总是文本格式,但为了制作一个通用的方法,有时可能是json、有时是XML或者HTML。因此,我将这个方法构建为一个独立的通用URL下载器。
我的问题是,当调用这个例程时,我必须等待响应。我知道所有“同步是不好的”论点......我并不经常这么做......但对于某些方法,我想要同步。
所以,我的问题是:下面是我简化的ASIHTTP代码,以及我能想到的在AFNetworking中编写此代码的唯一方法。问题是,AFNetworking有时在返回方法之前就无法获得响应。@mattt给出的[operation waitUntilFinished]
提示完全无法保持线程,直到完成块被调用......而我的另一种方法[queue waitUntilAllOperationsAreFinished]
也不一定总是有效的(并且不会触发[operation hasAcceptableStatusCode]子句的错误部分)。因此,如果有人可以帮忙,在不使用“设计异步”这个常见建议的情况下,请提供帮助。
ASIHTTP版本:
- (NSString *) queryChatSystem:(NSMutableDictionary *) theDict
{
NSString *response = [NSString stringWithString:@""];
NSString *theUrlString = [NSString stringWithFormat:@"%@%@",kDataDomain,kPathToChatScript];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:theUrlString]];
for (id key in theDict)
{
[request setPostValue:[theDict objectForKey:key] forKey:key];
}
[request setNumberOfTimesToRetryOnTimeout:3];
[request setAllowCompressedResponse:YES];
[request startSynchronous];
NSError *error = [request error];
if (! error)
{
response = [request responseString];
}
return response;
}
AFNetworking版本
- (NSString *) af_queryChatSystem:(NSMutableDictionary *) theDict
{
NSMutableDictionary *theParams = [NSMutableDictionary dictionaryWithCapacity:1];
for (id key in theDict)
{
[theParams setObject:[theDict objectForKey:key] forKey:key];
}
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:kDataDomain]];
NSMutableURLRequest *theRequest = [httpClient requestWithMethod:@"POST" path:[NSString stringWithFormat:@"/%@",kPathToChatScript] parameters:theParams];
__block NSString *responseString = [NSString stringWithString:@""];
AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:theRequest] autorelease];
operation.completionBlock = ^ {
if ([operation hasAcceptableStatusCode]) {
responseString = [operation responseString];
NSLog(@"hasAcceptableStatusCode: %@",responseString);
}
else
{
NSLog(@"[Error]: (%@ %@) %@", [operation.request HTTPMethod], [[operation.request URL] relativePath], operation.error);
}
};
NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[queue addOperation:operation];
[queue waitUntilAllOperationsAreFinished];
[httpClient release];
return responseString;
}
非常感谢您提供的任何想法。