Files
peko-ios/YuMi/Tools/Timer/XPWeakTimer.m
2023-07-14 18:50:55 +08:00

64 lines
1.7 KiB
Objective-C

//
// YMWeakTimer.m
// YUMI
//
// Created by YUMI on 2022/3/3.
//
#import "XPWeakTimer.h"
@interface XPWeakTimerTarget ()
@property (nonatomic, weak) id target;
@property (nonatomic, weak) NSTimer* timer;
@property (nonatomic, assign) SEL selector;
@end
@implementation XPWeakTimerTarget
- (void) fire:(NSTimer *)timer {
if(self.target) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[self.target performSelector:self.selector withObject:timer.userInfo afterDelay:0.0f];
#pragma clang diagnostic pop
} else {
[self.timer invalidate];
}
}
@end
@implementation XPWeakTimer
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats{
XPWeakTimerTarget* timerTarget = [[XPWeakTimerTarget alloc] init];
timerTarget.target = aTarget;
timerTarget.selector = aSelector;
timerTarget.timer = [NSTimer scheduledTimerWithTimeInterval:interval target:timerTarget selector:@selector(fire:) userInfo:userInfo repeats:repeats];
return timerTarget.timer;
}
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval block:(XPWeakTimerHandler)block userInfo:(id)userInfo repeats:(BOOL)repeats{
NSMutableArray *userInfoArray = [NSMutableArray arrayWithObject:[block copy]];
if (userInfo != nil) {
[userInfoArray addObject:userInfo];
}
return [self scheduledTimerWithTimeInterval:interval target:self selector:@selector(timerBlockInvoke:) userInfo:[userInfoArray copy] repeats:repeats];
}
+ (void)timerBlockInvoke:(NSArray*)userInfo {
XPWeakTimerHandler block = userInfo[0];
id info = nil;
if (userInfo.count == 2) {
info = userInfo[1];
}
if (block) {
block(info);
}
}
@end