需求如图,当在麦位的用户发送有结果的GIF表情时,要在麦位上展示当前的GIF效果。GIF动态执行3秒后,展示一张结果PNG保留1秒。
问题:当用户在第一个GIF还没有展示完毕的情况下发送了第二个GIF,会导致第一个GIF展示不完,并且第一个GIF的延时函数会导致显示错乱。
关于NSOperation的相关介绍这里不再赘述, 懒人推荐:点击这里~iOS基础深入补完计划--NSOperation
@interface xxx()
@property (nonatomic, strong) NSOperationQueue *opQueue;
@end
@implementation xxx
......
- (void)show{
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
//show gif
...
//阻止当前线程3秒,来执行GIF的动画效果
[NSThread sleepForTimeInterval:3.0];
//show png
...
//阻止当前线程1秒,来展示结果PNG图片
[NSThread sleepForTimeInterval:1.0];
//这里阻止的线程是NSOperation管理的子线程,可以放心阻塞不会影响其他
}];
[self.opQueue addOperation:op];
}
- (NSOperationQueue *)opQueue{
if (!_opQueue) {
_opQueue = [[NSOperationQueue alloc]init];
//设置为串行效果,按顺序执行
_opQueue.maxConcurrentOperationCount = 1;
}
return _opQueue;
}
@end
至此,就实现了GIF效果队列展示,并且每个GIF显示3秒,结果停留1秒。
在这个项目中,用到的地方非常多,比如礼物的连击展示效果,产品需要礼物的连击数量必须是连贯的,有时候用户点击太快,可能出现X1后就直接是X4,也可以使用队列来解决这个问题。
大家还有什么好的分享欢迎在评论中讨论。