简介:这个函数的作用在于将用户注册到服务端。 app 内部会有多个 UI 事件可能会触发这个 function 。 function 内部主要是俩个方法各自开了若干的异步线程申请资源。
需求:当有一处地方正在调用该 function 函数的时候 [结束标志为[someCaller doSth1] 或者 [someCaller doSth2];] ,另外一个地方触发调用这个函数的事件不允许进入此处调用 function 。
尝试: 1.NSLock 加锁 不能在不同线程间加锁。 2.在 doSth1 和 doSth2 的位置放上一个属性,该属性在设置的时候加锁 — 未解决
。。不知道 api 里边还有没有其他锁有此功能,或者用其他的方法来实现。谢谢~
-(void) function{
//func1WithCallback 内部开若干异步线程
[caller1 func1WithCallback:^(id someData){
//func2WithCallback 内部开若干异步线程
[caller2 func2WithSuccessCallback:^(id someData2){
[someCaller1 doSth1];
}errorCallback:^(id someErrorStatusData3){
[someCaller2 doSth2];
}];
}];
}
谢谢您的解答。 祝新年快乐!
1
Elethom Feb 16, 2016 via iPhone
類似 dispatch semaphore ?
|
2
lecher Feb 16, 2016 via Android
抽象出来,做 Singleton 模式,这样实例化的时候都是同一个实例,加锁就等于全局锁。
抽象出来,还是 Singleton 模式,不锁,但是用队列,请求处理封装成 block ,入队列,按开一个单独的线程处理队列的数据,保证一次只处理一个 HTTP 请求。 |
4
expkzb Feb 16, 2016
累不累,加个菊花转转不就好了,阻挡一下事件
|
6
vincentxue Feb 16, 2016
以我的理解,弄个 BOOL 变量在开始结束判断一下不就行了吗,为什么要用锁?
|
7
lecher Feb 16, 2016 via Android 把你的处理方法封装成单例模式,开放的接口不要直接执行处理,开放入队列的接口,处理方法封装一个 queue ,任务都扔里面去跑,新手的话有一个小坑, queue 跑完任务会自动释放,这时候有新任务进来需要重新实例化一个 queue 进行请求处理。
gcd 的接口有相关的处理。封装一下就可以。 我做过的的是利用 ASIqueue 的封装的单例,把数据处理从 view controller 剥离出来,写成 model ,开放入队接口,外部调用的时候,将需要数据和处理数据的函数通过 block 封装传给接口,接口拿到就把参数入队,执行完 HTTP 请求拿到数据,再回调 block 传进来的数据处理。 其实原生的 queue 库也可以做到这些,自己封装一下试试看? |
8
jesse_luo Feb 16, 2016
@vincentxue +1
不过操作 bool 时要加锁 |
9
dcty Feb 17, 2016
RAC
- (void)test{ [[self.signal1 then:^RACSignal *{ return self.signal2; }] subscribeNext:^(id x) { } error:^(NSError *error) { }]; } - (RACSignal *)signal1{ return [RACSignal combineLatest:signals]; } - (RACSignal *)signal2{ return [RACSignal combineLatest:signals]; } |