1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- // QGAnimatedImageDecodeThreadPool.m
- // Tencent is pleased to support the open source community by making vap available.
- //
- // Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
- //
- // Licensed under the MIT License (the "License"); you may not use this file except in
- // compliance with the License. You may obtain a copy of the License at
- //
- // http://opensource.org/licenses/MIT
- //
- // Unless required by applicable law or agreed to in writing, software distributed under the License is
- // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
- // either express or implied. See the License for the specific language governing permissions and
- // limitations under the License.
- #import "QGAnimatedImageDecodeThreadPool.h"
- #import "QGAnimatedImageDecodeThread.h"
- #import "QGVAPSafeMutableArray.h"
- @interface QGAnimatedImageDecodeThreadPool (){
- NSMutableArray *_threads;
- }
- @end
- @implementation QGAnimatedImageDecodeThreadPool
- + (instancetype)sharedPool {
- static QGAnimatedImageDecodeThreadPool *instance;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- instance = [[QGAnimatedImageDecodeThreadPool alloc] init];
- });
- return instance;
- }
- - (instancetype)init {
- if (self = [super init]) {
- _threads = [QGVAPSafeMutableArray new];
- }
- return self;
- }
- /**
- 从池子中找出没被占用的线程,如果没有则新建一个
-
- @return 解码线程
- */
- - (QGAnimatedImageDecodeThread *)getDecodeThread {
- QGAnimatedImageDecodeThread *freeThread = nil;
- for (QGAnimatedImageDecodeThread *thread in _threads) {
- if (!thread.occupied) {
- freeThread = thread;
- }
- }
- if (!freeThread) {
- freeThread = [[QGAnimatedImageDecodeThread alloc] initWithTarget:self selector:@selector(run) object:nil];
- [freeThread start];
- [_threads addObject:freeThread];
- }
- return freeThread;
- }
- - (void)run{
- //线程保活
- @autoreleasepool {
- [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
- NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
- [runLoop run];
- }
- }
- @end
|