Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

并发请求回调问题 #241

Closed
SuooL opened this issue Sep 30, 2016 · 10 comments
Closed

并发请求回调问题 #241

SuooL opened this issue Sep 30, 2016 · 10 comments

Comments

@SuooL
Copy link

SuooL commented Sep 30, 2016

我这边是这样的, 我把 YTK 和我的具体业务逻辑层做了一个二次封装
首先是
1
ran'h
然后做了一个 Manage 的类用来统一处理 Token 和回调的问题,如:
2

现在出现的问题是, 我在两个页面注册同一个监听登录成功的通知,每当用户登录成功后就会请求两个列表刷新界面, 这两个请求的代码片段如下:
界面1:
3
界面2:
2016093014752031993590.jpg

两个数组都是泛型,enquiryArray的数据类型是enquiryMode, 第二个请求的是TradeRecordModel,但是我在第二个界面登陆成功后再第一个界面回调刷新界面的时候会出现这样的错误
20160930147520332029202.jpg

也即是在得到通知后, 第一个界面和第二界面都会刷新界面, 但是在第一个请求的数组里面的数据却是第二个请求的回调数据...
请问您知道这个是为什么呢?
怎么样解决呢?
是不是因为线程的问题..

@albertjson
Copy link

推测应该是你的单例导致的共享数据,个人感觉巧神的原意是每个request自己进行初始化单独管理自己的属性。你却用了集约型的感觉
另外问下楼主,解析转model是封装到你baserequest类吗?能否贴点代码🙄

@SuooL
Copy link
Author

SuooL commented Oct 2, 2016

解析转 Model 并不在baserequest类, baserequest只是声明了两个属性而已.
而且这里的集约和 YTK 的发散式不矛盾的...
首先我的BaseRequest只是一个对YTKRequest的扩充, 因为业务层需要很多方法都是公共的, 要么选择继承自YTKRequest, 然后每个 API 类都要重写这些代码, 要么就是自己写一个BaseRequest继承YTKRequest,把这部分重复代码写进去, 然后让API 去继承这个BaseRequest.
转 Model 的封装在 Request 内:
6

其次关于这个集约型...
这里依然是一个请求一个 API 类, 也是各自管理自己的属性, 不过在我的业务层面, 一个 API 的属性无非两种, 一种是请求一个列表, 一种是请求一个实体对象信息, 也是我在 BaseRequest 中定义这两个属性的原因. 每个继承自BaseRequest的 API 都会具有两个属性.
而集约型管理是因为几乎每个 API 都需要判断一些 Token 和 Code 的问题, 我便设计了一个 Manage 的类来集中管理这些问题, 从而避免写这部分的重复的处理逻辑..当然这里这个 Manage是单例的..莫非就是因为这个单例的问题导致的错误?
Manage 的主要职责就是负责发送及管理请求回调内容的处理, 比如一个请求的示例代码如下:
7

具体的处理方法- (void)sendChainRequest:(LSBaseRequest *)serviceRequest retArray:(BOOL)isAry retObj:(BOOL)isObj在我上面的第二个截图中.

跟同事讨论时也觉得是单例的内存共享导致的问题,,这个是因为 Manage 的单例导致的么?

@albertjson
Copy link

success和failure 的回调内容被覆盖了,所以当第一个请求没拿到数据而又进行第二个请求的时候就会有这种情况,应该是这个情况。
我也在考虑如何在不改变源码的情况下对其进步一封装,比如重写失败和成功的回调,增加request 属性等等,但是不太好搞😂😂😂

@SuooL
Copy link
Author

SuooL commented Oct 4, 2016

.....明白了, 因为 Manage 是单例的, 所以回调内容会存在内存共享, 当使用 Manage 同时发送两个请求的时候, 两个请求的回调的会出现因为内存共享而覆盖的情况.....瞬间感觉自己给自己挖了一个大坑...

@SuooL
Copy link
Author

SuooL commented Oct 4, 2016

感觉只能单个请求单独处理自己的回调了...或者不使用单例, 写公共调用的方法给 API 使用..不知道有没有其他的好的解决方案..

@albertjson
Copy link

在使用工具类的意义不是特别大,而且使用工具类意味着很多直接从request 获取的属性都不好获取。继承于YTKRequest写个子类吧。就是统一处理成功或者失败block 就比较麻烦,需要改框架代码😭而且json转model 以及自定义error信息都需要改框架代码。

@SuooL
Copy link
Author

SuooL commented Oct 4, 2016

统一处理回调这个应该很普遍的吧...验证 token 和 code 感觉差不多所有的请求都要...不想改框架的代码😂😂😂

@skyline75489
Copy link
Contributor

为什么不使用 requestCompleteFilter 呢?可以在这里处理 code 的检查之类的

@SuooL
Copy link
Author

SuooL commented Oct 4, 2016

嗯, 刚刚看了下, 使用jsonValidator好像也能够实现验证 code 的检查需求, 我再研究下如何使用requestCompleteFilter, 谢谢啦~

@SuooL SuooL closed this as completed Oct 4, 2016
@albertjson
Copy link

@skyline75489 大神,上代码吧。我只想到了修改agent类里面的源码,不修改源码的情况下求指教

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants