小编sur*_*heW的帖子

使用计时器的引用循环中的强、弱或无主

我有一个对重复调用闭包的对象UIViewController的引用。Timer对象在其块中Timer捕获。self据我了解,这会导致retains cycle视图控制器和块之间的关系。有一个逻辑将定时器设置为nil,然后保留周期被打破,但它可能不会被执行。

我的问题如下:视图控制器将随着应用程序的存在而存在(至少在当前的实现中)。在这种情况下 - 我应该如何最好地处理这个保留周期?我应该忽略它吗,因为视图控制器无论如何都不会被释放。我应该考虑未来可能发生的变化并用unownedweak参考文献以及哪一个来处理它。我想这应该是unowned因为计时器仅由视图控制器保留,并且一旦视图控制器被释放,它应该被释放,但不确定我是否遗漏了一些东西。先感谢您。下面的代码是我正在谈论的内容的简单示例。Class A是视图控制器。

class A {

    var timer: Timer? = nil
    var varToReference: Int = 0

    func startTimer() {
        timer = Timer.scheduledTimer(withTimeInterval: 2, repeats: true, block: {  (theTimer) in

            self.varToReference += 1

        })
    }

    func stopTimer() {
        if let theTimer = timer {
            theTimer.invalidate()
            timer = nil
        }
    }

    func onAdapterStarts() {
        self.startTimer()
    }

    func onAdapterStops(){
        self.stopTimer()
    }

    deinit …
Run Code Online (Sandbox Code Playgroud)

closures memory-leaks ios swift reference-cycle

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

Swift中的项目符号列表-iOS

我需要在iOS应用程序中将项目符号文本添加到textView中。我在看这个链接这一个,并跟随他们的想法。这是我的代码:

let paragraph = NSMutableParagraphStyle()
paragraph.firstLineHeadIndent = 15
paragraph.headIndent = 15

attributes = [
    NSAttributedStringKey.paragraphStyle: paragraph
]

attributedString = NSAttributedString(string: "\u{2022} Some text some text some text some text some text some text", attributes: attributes)
finalText.append(attributedString)
Run Code Online (Sandbox Code Playgroud)

我需要的是使文本缩进上面的文本的开头。就像图片中的一样:

在此处输入图片说明

我得到的是带有项目符号起点的缩进文本。

在此处输入图片说明

nsattributedstring ios swift

3
推荐指数
4
解决办法
1545
查看次数

UITableView 滚动时跳转和闪烁

我有一个UITableView显示带有图像和一些文本的单元格。数据是按需请求的——我首先请求 10 行的数据,然后是接下来的 10 行,依此类推。我在tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath). 问题是当我收到数据并需要更新tableview它时,它有时会跳跃和/或闪烁。我打电话给reloadData。这是代码的一部分:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    DispatchQueue.global(qos: .background).async {
        if indexPath.row + 5 >= self.brands.count && !BrandsManager.pendingBrandsRequest {
            BrandsManager.getBrands() { (error, brands) in

                self.brands.append(contentsOf: brands as! [Brand])

                DispatchQueue.main.async { 

                    UIView.performWithoutAnimation {
                        self.brandsTableView.reloadData()
                    }

                }

            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

单元格的高度是恒定返回的,如下所示:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 70
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 …

flicker uitableview ios swift

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

OBD2 BLE通讯-如何发送AT命令和接收数据

我有一个 OBD2 加密狗,需要通过它获取车辆的速度(使用 BLE 和 iOS 设备)。加密狗附带的文档没有提到服务和特性,但通过一些调试我发现了一些。我们将它们称为服务 1、2、3。

  1. 服务 1 有一个特征,即 Read 属性和 WriteWithoutResponse 属性
  2. 服务2有一个特点,具有Read属性和Notify属性
  3. 服务 3 有两个特征:具有 Read 属性和 Notify 属性的特征 A 以及具有 Write 属性和 WriteWithoutResponse 属性的特征 B

如何知道我需要哪些特性来发送AT命令并接收相应的数据,然后如何发起这个通信。我特别需要能够获得速度。先感谢您。

我已尝试以下操作但没有发生任何事情:

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {

    for characteristic in service.characteristics! {

        if characteristic.properties.contains(.notify) {
            peripheral.setNotifyValue(true, for: characteristic)
        }

        if characteristic.properties.contains(.write) {
            let commandString = "010D\r"
            if let commandData = commandString.data(using: .utf8) {
                peripheral.writeValue(commandData, for: characteristic, type: .withoutResponse)
                peripheral.writeValue(commandData, for: characteristic, type: .withResponse)
            }
        } …
Run Code Online (Sandbox Code Playgroud)

ios bluetooth-lowenergy obd-ii

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

我应该选择 URLSessionDataTask 还是 URLSessionDownloadTask 来获取图像

我使用URLSessionURLSessionDataTask从服务器获取图像并将其显示在应用程序中。我在这里看了看。看来URLSessionDownloadTask还有更多的选择。

目前我使用以下代码来获取图像:

let task = URLSession.shared.dataTask(with: url) {(data, response, error) in

    guard error == nil else {
        completion(error, nil)
        return
    }

    completion(nil, data)            
}        
task.resume()
Run Code Online (Sandbox Code Playgroud)

我希望能够暂停、取消和恢复从服务器获取图像的过程。我在文档中看到URLSessionDataTask也有这些选项。但它也为URLSessionTask它的 suspend 方法编写:

下载任务可以稍后继续传输数据。所有其他任务在恢复后必须重新开始。

URLSessionDownloadTask所以我的问题是:如果我需要能够在某个时刻停止获取图像并稍后恢复而不丢失当前进度,我是否应该更改用于获取图像的实现?先感谢您。

ios nsurlsessiondownloadtask swift nsurlsessiondatatask

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

iOS变形播放/暂停动画

我想在我正在开发的应用程序中使用像变形播放/暂停动画这样的YouTube.它看起来像这里的动画.我不知道该怎么做.我知道我需要一个CABasicAnimationCAShapeLayer.我知道我需要两个(或者更多?)- UIBezierPaths.一个将是动画shapeLayer的另一个路径toValue.就像是:

shape.path = pausePath().cgPath

let animation = CABasicAnimation(keyPath: "path")
animation.toValue = trainglePath().cgPath
animation.duration = 1
shape.add(animation, forKey: animation.keyPath)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何走这条道路.我有以下问题:

  1. 道路的重要方式是什么?例如,从左到右绘制的线是否与从右到左制作的线不同?我的意思是path.move(to: startPoint); path.addLine(to: endPoint1)反对path.move(to: endPoint1);path.addLine(to: startPoint)
  2. 两条路是否足够?一个用于启动按钮,一个用于暂停按钮?如果是的话 - 绘制它们的正确方法是什么,以便它们能够"正确"地制作动画?我不在这里要求代码(不是我介意将代码作为答案)但是一些一般的解释对于初学者来说已经足够了.

cabasicanimation cashapelayer ios swift

0
推荐指数
2
解决办法
542
查看次数

iOS 上的 Firebase Analytics 事件 - 测试和生产

我正在开发的 iOS 应用程序用于Firebase Analytics报告事件。它按预期工作,但该应用程序尚未投入生产。一旦完成,最好将真实用户记录的事件与调试时记录的事件分开。

Firebase Analytics分别记录测试和生产事件 的最佳方法是什么?

ios firebase firebase-analytics

0
推荐指数
1
解决办法
1688
查看次数