小编sol*_*oid的帖子

Objective C&iOS:运行计时器?的NSTimer /主题/的NSDate的/ etc

我正在开发我的第一个iOS应用程序,并且遇到了第一个问题我无法找到一个好的答案.

问题:我有一个自定义UIGestureRecognizer并且所有连线都正确连接,我可以@selector在识别后为每次触摸运行代码.这对大多数事情来说都很好,但对其他人来说这是一个太多的输入.

我的目标:制作一个以指定间隔触发的计时器来运行逻辑,并且能够在取消触摸时取消此计时.

我在这里问的原因:解决方案有很多可能性,但没有一个能够成为最好的解决方案.到目前为止似乎

  • performSelector (以及对此的一些变化)
  • NSThread
  • NSTimer
  • NSDate
  • 操作队列
  • 我想我也发现了其他一些......

从所有的研究来看,某种形式的线程似乎是可行的路线,但我不知道哪种方式最适合这种情况.

实现的示例:NSPoint每0.10秒采用一次,并且采用前一点和当前点之间的距离.[取每个点之间的距离产生非常混乱的结果].

相关代码:

- (void)viewDidLoad {
 CUIVerticalSwipeHold *vSwipe =
 [[CUIVerticalSwipeHold alloc]
 initWithTarget:self 
 action:@selector(touchHoldMove:)];
 [self.view addGestureRecognizer:vSwipe];
 [vSwipe requireGestureRecognizerToFail:doubleTap];
}

...

- (IBAction)touchHoldMove:(UIGestureRecognizer *)sender {
     if (sender.state == UIGestureRecognizerStateEnded) {

     }

     if (sender.state == UIGestureRecognizerStateBegan) {

     }

     //other stuff to do goes here

}
Run Code Online (Sandbox Code Playgroud)

objective-c nsdate nstimer nsthread ios

6
推荐指数
1
解决办法
6611
查看次数

Bug:使用 assetURL 在 iOS 和 MPMediaPropertyPredicate 上下载 MPMediaItem 状态

MPMedia API 中的有趣错误

我的音乐应用程序中存在一个持续存在的错误,我现在终于找到了它(现在我正在快速重写它)。它有几个方面。(使用系统音乐播放器)

  1. 我想我已经将问题范围缩小到具有以下属性的 MPMediaItem。
    • MPMediaItemPropertyIsCloudItem = true
    • 资产URL = nil
    • ** 这两个是有道理的,但是下面的极端情况(很可能很常见)让我困惑了一段时间**
    • 前两项可能是真的,但我相信如果你从 iTunes 复制它,它/可以/可以播放(它们对我来说大部分时间都会播放),但没有办法告诉你。我已经反复测试过这一点,似乎确实如此,但这些 MPMediaItems 的存在可能只会有时导致问题,或者它们很好。但你无法找出这些是哪些歌曲。
  2. 如果您正在播放队列,并且 systemMusicPlayer 在您的库中遇到一首歌曲但未从 iTunes 下载或复制,我相信它会自动跳过该歌曲,类似于 systemMusicPlayer.skipToNextItem(),但我认为在内部这是一个不同的机制。
    • 2a. 如果您正在使用 systemMusicPlayer.skipToPreviousItem() 并遇到一个本来会被跳过的项目,这种行为会导致基本上不可恢复的问题 - 这意味着,它无法识别您正在尝试移回队列并只是抛出错误并将队列向前移动。
    • 2b. 据我所知,当继续发生错误时,MPMediaItem 永远不会变成 nowPlayingItem。向后的问题因 MPMediaItem 元数据(无论是否在本地都始终可用)被加载而变得更加复杂,但尝试播放的歌曲会立即再次将其向前发送到队列中。

好吧,真是愚蠢又令人气愤。

现在回答我的问题:

对于无法知道云项目是否在设备上(通过 iTunes)的情况,我无能为力。但是,我/应该/能够过滤掉某个项目是否具有 assetURL,这保证了它是本地的且可用。

let filter:MPMediaPropertyPredicate = MPMediaPropertyPredicate(value: "ipod", forProperty: MPMediaItemPropertyAssetURL, comparisonType: MPMediaPredicateComparison.Contains)
Run Code Online (Sandbox Code Playgroud)

这将返回 0 个项目。有谁知道过滤此属性的方法?在这里这样做似乎是最干净的,并且应该让查询返回 items 和 itemSections。我的所有表都是从查询中填充的,我认为没有一种方法可以手动重建表。

URL 的格式如下:ipod-library://item/item.m4a?id=5314739480586915369

现在,我怀疑在填充表视图等时可以添加捕获,但感觉真的很混乱。

这是 ios 9.2.1、Swift 2、Xcode 7.2.1

我还没有擦手机并重新复制歌曲。如果 assetURL 不存在,则从音乐应用程序手动下载它们是项目获取 assetURL 的唯一方法。

mpmediaitem mpmediaquery ios swift

5
推荐指数
1
解决办法
983
查看次数

AVAudioSession.sharedInstance()。outputVolume不一致地返回正确的音量

通过以下代码,我得到了输出音量,但实际上是不一致的-有时它给出相同的值,有时尽管系统音量实际上正确更改,但后面却有音量变化。

有什么办法让它每次输出正确的值?

func viewDidLoad() {
...

        NotificationCenter.default.addObserver(self, selector: #selector(volumeDidChange), name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
...

}


func volumeDidChange() {
   print("VOLUME CHANGING", AVAudioSession.sharedInstance().outputVolume)

// output while changing the volume with hardware buttons
VOLUME CHANGING 0.0625
VOLUME CHANGING 0.0625
VOLUME CHANGING 0.125
VOLUME CHANGING 0.1875
VOLUME CHANGING 0.25
VOLUME CHANGING 0.375
VOLUME CHANGING 0.375
VOLUME CHANGING 0.4375
VOLUME CHANGING 0.5
VOLUME CHANGING 0.5625
VOLUME CHANGING 0.625
VOLUME CHANGING 0.6875
VOLUME CHANGING 0.75
VOLUME CHANGING 0.8125
VOLUME CHANGING 0.875
VOLUME CHANGING 0.75
VOLUME …
Run Code Online (Sandbox Code Playgroud)

ios avaudiosession swift

5
推荐指数
1
解决办法
503
查看次数

Swift:gettimeofday和Unsafe Pointers

Swift中的代码

...
var time:timeval?
gettimeofday(UnsafePointer<timeval>, UnsafePointer<()>) // this is the method expansion before filling in any data
...
Run Code Online (Sandbox Code Playgroud)

目标C中的代码

...
struct timeval time;
gettimeofday(&time, NULL);
...
Run Code Online (Sandbox Code Playgroud)

我一直在试图找到有关UnsafePointer的更多信息以及传递NULL的替代方法,但我可能正在咆哮错误的树.

如果有人知道如何在Swift中使用等效代码,那就太好了.如果有一个很好的解释,它会发生什么,甚至更好!

null unsafe-pointers gettimeofday swift

2
推荐指数
1
解决办法
1486
查看次数