NSTimer 未从 Singleton 触发 Class
NSTimer is not firing from Singleton Class
我有一个单身人士 class,我想在后台 运行 并检查要上传的照片。单例通过
从另一个viewcontroller初始化
[[EXOImageUploader sharedPhotoUploader] startPhotoUploadCheck];
如果我对所有内容都进行 NSLog,则表明单例正在运行。我可以在单例中做下面没有显示的其他事情。 NSTimer
永远不会触发。我什至注释掉了检查定时器 isValid
的行,但这也不起作用。
知道为什么我的计时器能正常工作吗?
这里是NSLog吐出来的顺序
- sharedPhotoUploader 初始化
- 执行设置
- 定时器间隔:1.000000
- sharedPhotoUploader 单例
- 开始照片上传检查
这是代码。
.h
@interface EXOImageUploader : NSObject
@property (assign) NSTimeInterval timerCheckInterval;
+ (EXOImageUploader *) sharedPhotoUploader;
- (void) startPhotoUploadCheck;
- (void) stopPhotoUploadCheck;
.m
@interface EXOImageUploader ()
@property (nonatomic, strong) NSTimer* timerUpload;
@end
@implementation EXOImageUploader
static EXOImageUploader* _sharedPhotoUploader;
#pragma mark - SINGLETON SETUP
+ (EXOImageUploader *) sharedPhotoUploader {
static EXOImageUploader *sharedPhotoUploader = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedPhotoUploader = [[self alloc] init];
NSLog(@"sharedPhotoUploader singleton");
});
return sharedPhotoUploader;
}
- (id) init {
if (self = [super init]){
NSLog(@"sharedPhotoUploader init");
[self doSetup];
}
return self;
}
- (void) doSetup {
NSLog(@"doSetup");
if (!self.timerCheckInterval) {
self.timerCheckInterval = 1.0f;
}
NSLog(@"Timer interval: %f", self.timerCheckInterval);
}
#pragma mark Public Methods
- (void) startPhotoUploadCheck {
NSLog(@"startPhotoUploadCheck");
//Don't start a new one if this one is running
if (!_timerUpload) {
_timerUpload = [NSTimer timerWithTimeInterval:_timerCheckInterval target:self selector:@selector(checkForPhotosToUpload) userInfo:nil repeats:YES];
}
}
- (void) stopPhotoUploadCheck {
NSLog(@"stopPhotoUploadCheck");
[_timerUpload invalidate];
_timerUpload = nil;
}
您正试图在未初始化的情况下使用您的计时器,因此它将为 nil 并且不会触发。像这样激活你的计时器:
[timerUpload scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(targetMethod:)
userInfo:nil
repeats:NO];
使用 scheduledTimerWithTimeInterval
代替 timerWithTimeInterval
。
timerWithTimeInterval
的文档说:"You must add the new timer to a run loop, using addTimer:forMode:"。
对于 "scheduled" 版本,这已经为您完成了。
我有一个单身人士 class,我想在后台 运行 并检查要上传的照片。单例通过
从另一个viewcontroller初始化[[EXOImageUploader sharedPhotoUploader] startPhotoUploadCheck];
如果我对所有内容都进行 NSLog,则表明单例正在运行。我可以在单例中做下面没有显示的其他事情。 NSTimer
永远不会触发。我什至注释掉了检查定时器 isValid
的行,但这也不起作用。
知道为什么我的计时器能正常工作吗?
这里是NSLog吐出来的顺序
- sharedPhotoUploader 初始化
- 执行设置
- 定时器间隔:1.000000
- sharedPhotoUploader 单例
- 开始照片上传检查
这是代码。
.h
@interface EXOImageUploader : NSObject
@property (assign) NSTimeInterval timerCheckInterval;
+ (EXOImageUploader *) sharedPhotoUploader;
- (void) startPhotoUploadCheck;
- (void) stopPhotoUploadCheck;
.m
@interface EXOImageUploader ()
@property (nonatomic, strong) NSTimer* timerUpload;
@end
@implementation EXOImageUploader
static EXOImageUploader* _sharedPhotoUploader;
#pragma mark - SINGLETON SETUP
+ (EXOImageUploader *) sharedPhotoUploader {
static EXOImageUploader *sharedPhotoUploader = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedPhotoUploader = [[self alloc] init];
NSLog(@"sharedPhotoUploader singleton");
});
return sharedPhotoUploader;
}
- (id) init {
if (self = [super init]){
NSLog(@"sharedPhotoUploader init");
[self doSetup];
}
return self;
}
- (void) doSetup {
NSLog(@"doSetup");
if (!self.timerCheckInterval) {
self.timerCheckInterval = 1.0f;
}
NSLog(@"Timer interval: %f", self.timerCheckInterval);
}
#pragma mark Public Methods
- (void) startPhotoUploadCheck {
NSLog(@"startPhotoUploadCheck");
//Don't start a new one if this one is running
if (!_timerUpload) {
_timerUpload = [NSTimer timerWithTimeInterval:_timerCheckInterval target:self selector:@selector(checkForPhotosToUpload) userInfo:nil repeats:YES];
}
}
- (void) stopPhotoUploadCheck {
NSLog(@"stopPhotoUploadCheck");
[_timerUpload invalidate];
_timerUpload = nil;
}
您正试图在未初始化的情况下使用您的计时器,因此它将为 nil 并且不会触发。像这样激活你的计时器:
[timerUpload scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(targetMethod:)
userInfo:nil
repeats:NO];
使用 scheduledTimerWithTimeInterval
代替 timerWithTimeInterval
。
timerWithTimeInterval
的文档说:"You must add the new timer to a run loop, using addTimer:forMode:"。
对于 "scheduled" 版本,这已经为您完成了。