传统C++中网络调用处理一般比较麻烦,如果异步的话则更麻烦。但在iOS里,一切都变得很简单。
下面是一个基本框架,供大家参考:
NSString *str = ...;
NSURL *url = [NSURL URLWithString:str];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:10];
UIAlertView *progressView = ...
// 异步调用
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSError *error = nil;
NSURLResponse *response = nil;
// 再另外一个队列里同步调用网络请求
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
dispatch_async(dispatch_get_main_queue(), ^{
// 关闭进度指示
[progressView dismissWithClickedButtonIndex:0 animated:YES];
});
// 0.2s后执行处理,主要是考虑如果处理完成后有UI变动话,可以等上面的进度指示先消失完毕
// 其实我更想进度指示里的内容直接改变成结果的内容,如成功、失败等。但没有找到方法实现。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (data == nil || response == nil || error != nil) {
ERROR_LOG(@"delete failed: %@", error);
[utils showAlert:nil message:NSLocalizedString(@"alert.connect.fail", nil)];
}
else {
NSError *jsonError = nil;
// iOS JSON处理也很方便
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingAllowFragments
error:&jsonError];
if (jsonError != nil) {
ERROR_LOG(@"parse response json failed: %@", jsonError);
[utils showAlert:nil message:NSLocalizedString(@"alert.response.invalid", nil)];
}
else {
int errCode = [(NSNumber *)[dict objectForKey:kHttpErrorCode] intValue];
if (errCode == 0) {
。。。成功处理
}
else {
NSString *errMsg = [dict objectForKey:kHttpErrorMessage];
ERROR_LOG(@"login failed, got message: %@", errMsg);
。。。其它处理处理
}
}
});
});
当然也可以直接使用异步HTTP处理,早期有些操作用异步。用来发现把同步放在dispatch_async里更简单,就一般使用上述模式了。
希望对大家有所帮助。