IOS异步网络处理

传统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里更简单,就一般使用上述模式了。

希望对大家有所帮助。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值