【问题标题】:Double Tap Recognizer Not Working with NSTimer running双击识别器不适用于 NSTimer 运行
【发布时间】:2013-07-31 13:44:20
【问题描述】:

我有一个计时器:

[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];
    });
}

我还用gestureRecognizer设置了imageView

[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,则双击响应。因此,我怀疑由于运行计时器调用的后台功能,双击没有响应。

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

【问题讨论】:

  • 我怀疑这是因为您的计时器中的重复间隔太短了。什么是 jpegInterval?
  • jpegInterval 为 200,因此计时器将每 200 毫秒重复一次
  • 它也会立即杀死你的 UI,因为你只是将它分派回主队列。它们并没有真正在后台运行。
  • 有没有人有更好的解决方案?即使使用 Wain 建议的 ans,jpegInterval 也需要设置得更高。我需要它尽可能小。
  • 老兄,您将受到访问 URL 和下载内容的速度的限制。这已经是最好的解决方案了。

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


【解决方案1】:

当你这样做时:

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];
       });
    });
}

【讨论】:

  • 你如何建议我做 dispatch_get_global_queue 并推送到主线程来处理结果?对不起,我是 grand_central_dispatch 的新手。也许是示例代码?
猜你喜欢
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多