Files
midi_ios/QXLive/Manager/QXRedPacketManager.m
2025-10-12 15:48:35 +08:00

102 lines
2.9 KiB
Objective-C

//
// 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];
[self startCheckTimer];
}
return self;
}
- (void)addRedPacket:(QXRedPacketModel *)redPacket {
if (!redPacket.packetId) return;
self.redPackets[redPacket.packetId] = 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<QXRedPacketModel *> *)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