// // 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]; [self startCheckTimer]; } return self; } - (void)addRedPacket:(QXRedPacketModel *)redPacket { if (!redPacket.redpacket_id) return; self.redPackets[redPacket.redpacket_id] = redPacket; if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didAddRedPacket:)]) { [self.delegate respondsToSelector:@selector(QXRedPacketManager:didAddRedPacket:)]; } } - (void)removeRedPacket:(NSString *)packetId { [self.redPackets removeObjectForKey:packetId]; if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didRemoveRedPacket:)]) { [self.delegate QXRedPacketManager:self didRemoveRedPacket:packetId]; } } - (NSArray *)allRedPackets { return [self.redPackets allValues]; } - (QXRedPacketModel *)redPacketAtPosition:(NSInteger)position { for (QXRedPacketModel *packet in self.redPackets.allValues) { if (packet.position == position) { return packet; } } return nil; } - (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) { BOOL wasAvailable = packet.isAvailable; packet.isAvailable = [packet canOpenNow]; // 状态发生变化时通知 if (wasAvailable != packet.isAvailable) { if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didUpdateRedPacket:)]) { [self.delegate QXRedPacketManager:self didUpdateRedPacket:packet]; } } // 倒计时结束的红包可以设置自动移除 // if (packet.type == RedPacketTypeCountdown && [packet remainingTime] <= -10) { // // 倒计时结束10秒后自动移除 // [self removeRedPacket:packet.packetId]; // } } } - (void)dealloc { [self.checkTimer invalidate]; self.checkTimer = nil; } @end