NSTimer 未从 Singleton 触发 Class

NSTimer is not firing from Singleton Class

我有一个单身人士 class,我想在后台 运行 并检查要上传的照片。单例通过

从另一个viewcontroller初始化
[[EXOImageUploader sharedPhotoUploader] startPhotoUploadCheck];

如果我对所有内容都进行 NSLog,则表明单例正在运行。我可以在单例中做下面没有显示的其他事情。 NSTimer 永远不会触发。我什至注释掉了检查定时器 isValid 的行,但这也不起作用。

知道为什么我的计时器能正常工作吗?

这里是NSLog吐出来的顺序

  1. sharedPhotoUploader 初始化
  2. 执行设置
  3. 定时器间隔:1.000000
  4. sharedPhotoUploader 单例
  5. 开始照片上传检查

这是代码。

.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" 版本,这已经为您完成了。