// // QXRedPacketManager.m // QXLive // // Created by 启星 on 2025/10/11. // #import "QXRedPacketManager.h" @interface QXRedPacketManager () @property (nonatomic, strong) NSMutableDictionary *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; } -(void)addRedPackets:(NSArray *)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]; } } - (void)addRedPacket:(QXRedPacketModel *)redPacket { if (!redPacket.redpacket_id) return; self.redPackets[redPacket.redpacket_id] = redPacket; if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didAddRedPacket:remainingCount:)]) { [self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didAddRedPacket:redPacket remainingCount:self.redPackets.count]; } } - (void)removeRedPacket:(NSString *)packetId { [self.redPackets removeObjectForKey:packetId]; if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didRemoveRedPacket:remainingCount:)]) { [self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didRemoveRedPacket:packetId remainingCount:self.redPackets.count]; } } - (NSArray *)allRedPackets { return [self.redPackets allValues]; } -(QXRedPacketModel *)getRedPacket:(NSString *)packetId{ return [self.redPackets objectForKey:packetId]; } - (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) { // 倒计时结束的红包可以设置自动移除 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]; } BOOL wasAvailable = packet.isAvailable; packet.isAvailable = [packet canOpenNow]; // 状态发生变化时通知 if (wasAvailable != packet.isAvailable) { if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didUpdateRedPacket:remainingCount:)]) { [self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didUpdateRedPacket:packet remainingCount:self.redPackets.count]; } } } } -(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; } - (void)dealloc { if (self.checkTimer) { [self.checkTimer invalidate]; self.checkTimer = nil; } } @end