Files
midi_ios/QXLive/Manager/QXRedPacketManager.m
2025-10-15 17:21:09 +08:00

131 lines
4.2 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];
}
return self;
}
-(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];
}
}
- (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<QXRedPacketModel *> *)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