2025-10-12 15:48:35 +08:00
|
|
|
//
|
|
|
|
|
// QXRedPacketManager.m
|
|
|
|
|
// QXLive
|
|
|
|
|
//
|
|
|
|
|
// Created by 启星 on 2025/10/11.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
#import "QXRedPacketManager.h"
|
|
|
|
|
|
|
|
|
|
@interface QXRedPacketManager ()
|
|
|
|
|
@property (nonatomic, strong) NSMutableDictionary<NSString *, QXRedPacketModel *> *redPackets;
|
|
|
|
|
@property (nonatomic, strong) NSTimer *checkTimer;
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
@implementation QXRedPacketManager
|
|
|
|
|
|
|
|
|
|
+ (instancetype)sharedManager {
|
|
|
|
|
static QXRedPacketManager *instance = nil;
|
|
|
|
|
static dispatch_once_t onceToken;
|
|
|
|
|
dispatch_once(&onceToken, ^{
|
|
|
|
|
instance = [[QXRedPacketManager alloc] init];
|
|
|
|
|
});
|
|
|
|
|
return instance;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (instancetype)init {
|
|
|
|
|
self = [super init];
|
|
|
|
|
if (self) {
|
|
|
|
|
_redPackets = [NSMutableDictionary dictionary];
|
|
|
|
|
}
|
|
|
|
|
return self;
|
|
|
|
|
}
|
2025-10-15 17:21:09 +08:00
|
|
|
-(void)addRedPackets:(NSArray<QXRedPacketModel *> *)redPackets{
|
|
|
|
|
if (redPackets.count == 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
for (QXRedPacketModel*md in redPackets) {
|
|
|
|
|
self.redPackets[md.redpacket_id] = md;
|
|
|
|
|
}
|
|
|
|
|
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didAddRedPackets:remainingCount:)]) {
|
|
|
|
|
[self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didAddRedPackets:redPackets remainingCount:self.redPackets.count];
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-10-12 15:48:35 +08:00
|
|
|
- (void)addRedPacket:(QXRedPacketModel *)redPacket {
|
2025-10-13 14:16:49 +08:00
|
|
|
if (!redPacket.redpacket_id) return;
|
2025-10-12 15:48:35 +08:00
|
|
|
|
2025-10-13 14:16:49 +08:00
|
|
|
self.redPackets[redPacket.redpacket_id] = redPacket;
|
2025-10-12 15:48:35 +08:00
|
|
|
|
2025-10-15 17:21:09 +08:00
|
|
|
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didAddRedPacket:remainingCount:)]) {
|
|
|
|
|
[self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didAddRedPacket:redPacket remainingCount:self.redPackets.count];
|
2025-10-12 15:48:35 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)removeRedPacket:(NSString *)packetId {
|
|
|
|
|
[self.redPackets removeObjectForKey:packetId];
|
|
|
|
|
|
2025-10-15 17:21:09 +08:00
|
|
|
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didRemoveRedPacket:remainingCount:)]) {
|
|
|
|
|
[self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didRemoveRedPacket:packetId remainingCount:self.redPackets.count];
|
2025-10-12 15:48:35 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (NSArray<QXRedPacketModel *> *)allRedPackets {
|
|
|
|
|
return [self.redPackets allValues];
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-15 17:21:09 +08:00
|
|
|
-(QXRedPacketModel *)getRedPacket:(NSString *)packetId{
|
|
|
|
|
return [self.redPackets objectForKey:packetId];
|
2025-10-12 15:48:35 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)startCheckTimer {
|
|
|
|
|
self.checkTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
|
|
|
|
|
target:self
|
|
|
|
|
selector:@selector(checkAndUpdateRedPackets)
|
|
|
|
|
userInfo:nil
|
|
|
|
|
repeats:YES];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)checkAndUpdateRedPackets {
|
|
|
|
|
NSArray *packets = [self.allRedPackets copy];
|
|
|
|
|
|
|
|
|
|
for (QXRedPacketModel *packet in packets) {
|
2025-10-15 17:21:09 +08:00
|
|
|
// 倒计时结束的红包可以设置自动移除
|
|
|
|
|
long packetTime = [packet remainingTime];
|
|
|
|
|
if ((packetTime <= -packet.redpacket_time.intValue)) {
|
|
|
|
|
// 倒计时结束10秒后自动移除
|
|
|
|
|
[self removeRedPacket:packet.redpacket_id];
|
|
|
|
|
}
|
|
|
|
|
if (packet.countdown.intValue == 0) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didUpdateRedPacketTime:redPacket:)]) {
|
|
|
|
|
[self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didUpdateRedPacketTime:packetTime redPacket:packet];
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-12 15:48:35 +08:00
|
|
|
BOOL wasAvailable = packet.isAvailable;
|
|
|
|
|
packet.isAvailable = [packet canOpenNow];
|
|
|
|
|
|
|
|
|
|
// 状态发生变化时通知
|
|
|
|
|
if (wasAvailable != packet.isAvailable) {
|
2025-10-15 17:21:09 +08:00
|
|
|
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didUpdateRedPacket:remainingCount:)]) {
|
|
|
|
|
[self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didUpdateRedPacket:packet remainingCount:self.redPackets.count];
|
2025-10-12 15:48:35 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-15 17:21:09 +08:00
|
|
|
|
|
|
|
|
|
2025-10-12 15:48:35 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-10-15 17:21:09 +08:00
|
|
|
-(void)removeAllRedpackets{
|
|
|
|
|
[self.redPackets removeAllObjects];
|
|
|
|
|
}
|
|
|
|
|
-(void)endCheckTimer{
|
|
|
|
|
if (self.checkTimer) {
|
|
|
|
|
[self.checkTimer invalidate];
|
|
|
|
|
self.checkTimer = nil;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
-(void)destoryRedpacketInfo{
|
|
|
|
|
[self removeAllRedpackets];
|
|
|
|
|
[self endCheckTimer];
|
|
|
|
|
self.delegate = nil;
|
|
|
|
|
}
|
2025-10-12 15:48:35 +08:00
|
|
|
- (void)dealloc {
|
2025-10-15 17:21:09 +08:00
|
|
|
if (self.checkTimer) {
|
|
|
|
|
[self.checkTimer invalidate];
|
|
|
|
|
self.checkTimer = nil;
|
|
|
|
|
}
|
2025-10-12 15:48:35 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@end
|