Open YogurtBiu opened 5 years ago
目前发现另一个问题。需求是利用一个轻量接口校验启动广告是否有效,首先发起请求,并阻塞主线程,如果请求成功则根据数据回到主线程继续做逻辑处理(展示上次启动App时预加载的广告页面等);如果1.5s内接口没有完成响应,则回到主线程取消请求继续做逻辑处理(跳过广告展示进入首页等);
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[XXXAPIManager loadDataWithParams:XXX success:^(CTAPIBaseManager * _Nonnull apiManager) {
//do something
dispatch_semaphore_signal(sema);
} fail:^(CTAPIBaseManager * _Nonnull apiManager) {
//do something
dispatch_semaphore_signal(sema);
}];
dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)));
[[XXXAPIManager new] cancelAllRequests]; //取消请求
//do something
但是CTAPIBaseManager.m中以下代码因为在dispatch_get_main_queue()
中回调,会导致上述代码主线程堵塞:
if ([self beforePerformSuccessWithResponse:response]) {
dispatch_async(dispatch_get_main_queue(), ^{
if ([self.delegate respondsToSelector:@selector(managerCallAPIDidSuccess:)]) {
[self.delegate managerCallAPIDidSuccess:self];
}
if (self.successBlock) {
self.successBlock(self);
}
});
}
不知是否能提供接口供开发者在自己所需线程回调呢?
嗯,这个dispatch确实没什么必要,可以直接删掉。具体的dispatch的事情其实可以放在delegate的实现里面去做。
1问题和6问题其实是一样的。
origin参数不带验证参数,actual参数就是在service中给origin添加了验证逻辑的参数。
验证逻辑应该以tool的方式给到,也就是说以组合的方式给到,而不应该是继承。
感谢casa的回复,CTNetworking非常灵活与强大,设计的时候可能留下很多供开发者奇思妙想的地方,但是有时候缺乏指引而错过这些巧妙之处毕竟可惜,非常期待TODO中的系列Demo。
casa你好,首先非常感谢你提供这么灵活优雅的网络框架。 我在使用过程中遇到以下疑惑,还请指导:
谢谢!