ios - 双击识别器不适用于 NSTimer 运行

标签 ios objective-c nstimer grand-central-dispatch uitapgesturerecognizer

我有一个计时器:

[NSTimer scheduledTimerWithTimeInterval:(float)jpegInterval/1000 target:self selector:@selector(jpegDownloaderSelector:) userInfo:url repeats:YES];

jpegDownloaderSelector 执行从 url 中获取图像并将其设置在 imageView 中,如下所示:

-(void) jpegDownloaderSelector:(NSTimer*)timer{
    [self performSelectorInBackground:@selector(jpegDownloader:) withObject:(NSString*)[timer userInfo]];
}

-(void) jpegDownloader:(NSString*)imageUrl{
    dispatch_async(dispatch_get_main_queue(), ^{        
       imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://10.8.9.100:509/jpeg"]];
       imageView.image = [UIImage imageWithData:imgData];
    });
}

我还设置了 imageView 和 gestureRecognizer

[imageView addGestureRecognizer:singleTapRecognizer];
[imageView addGestureRecognizer:doubleTapRecognizer];

识别器定义在哪里:

singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(functoCall:)];
singleTapRecognizer.numberOfTapsRequired = 1;
singleTapRecognizer.numberOfTouchesRequired = 1;

doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(funcToCall2:)];
doubleTapRecognizer.numberOfTapsRequired = 2;
doubleTapRecognizer.numberOfTouchesRequired = 1;

我遇到的问题是,当计时器启动时,我双击 imageView,双击识别器没有响应,而是单击响应。

如果我为定时器重复参数设置 NO,双击响应。因此,我怀疑由于定时器调用的后台函数的运行,双击没有响应。

谁有建议我可以实现后台功能,识别双击没问题。

最佳答案

当你这样做时:

dispatch_async(dispatch_get_main_queue(), ^{

您正在将任务推送到主线程,只是在很短的延迟之后。因此,您的图片下载是在主线程上完成的,并且会阻止所有其他交互。

相反,您应该在后台线程 (dispatch_get_global_queue) 上运行下载,然后仅返回主线程来处理结果。


-(void) jpegDownloader:(NSString*)imageUrl {
    dispatch_async(dispatch_get_global_queue(), ^{        
       imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://10.8.9.100:509/jpeg"]];

       dispatch_async(dispatch_get_main_queue(), ^{
           imageView.image = [UIImage imageWithData:imgData];
       });
    });
}

关于ios - 双击识别器不适用于 NSTimer 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17942780/

相关文章:

ios - Swift:根据秒数格式化时间字符串

ios - 拦截电话 - iPhone(挂接 CoreTelephony 的正确方法)

ios - 要关闭键盘,使用 `resignFirstResponder` 和 `endEditing` 之间有什么区别吗?

ios - 核心数据与 iCloud 同步随机崩溃

ios - 在 icecast 服务器中设置挂载点

iphone - 使用 NSTimer 的序列动画

ios - 在 iOS5 项目中导入框架

ios - iPhone OS Utility App - Flipside View 和 Main View 通信

ios - 内存管理目标 - C

ios - 如何在倒数计时器 Objective-C 中添加年份和月份