问题标签 [ios-multithreading]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
94 浏览

ios - Swift 后台线程上来自 Realm 的不一致状态

尽管使用自动释放池并在每次访问领域时实例化一个新领域实例,但有时我会得到不一致的状态。

在以下(人为的)示例中,只有一个MyObject存储在数据库中。删除后,第二个查询仍然看到该实例。任何人都可以阐明为什么会这样吗?它在大多数情况下都有效,但在极少数情况下我会出现不一致的状态。有时在两个单独的线程上访问领域时会发生这种情况,但它曾经发生在同一个线程上。

我知道我可能可以realm.refresh()在第二个查询之前打电话(我没有测试过),但我的问题是我为什么需要这样做?每个函数都有自己的领域实例,并根据文档推荐包装在 autoreleasepool 中。我是不是误会了什么?

提前致谢!

0 投票
1 回答
46 浏览

ios - iOS Swift:在不到 20 秒的时间内一次(并发)启动 100 个 URL 的下载任务

在我的一个项目中,我们正在开发一个有趣的功能,那就是我们有一个 rest json 响应,它包含 100 个媒体下载 url。由于某些安全原因,从收到响应的时间起,这些 URL 的有效期为 20 秒以开始下载过程。这里重要的是所有 100 个 URL 应该在 20 秒内开始下载过程,那些可以在稍后完成我们没有任何问题,但重要的是那些应该在 REST 响应时间的 20 秒内开始下载过程。

我们在 iOS 中有并发多线程概念,但我不确定,所有线程将在 20 秒内启动 100 个 url 的下载过程。

请让我知道您对此的看法。提前致谢。

0 投票
2 回答
557 浏览

ios - NSLock 在属性设置器中的使用

假设有一个变量我想让线程安全。执行此操作的最常见方法之一:

但是,如果我们像下面的示例中那样更改值,则此属性不是完全线程安全的:

所以我的问题是:在同样的原则上使用 NSLock也不是完全线程安全的吗?

0 投票
1 回答
1074 浏览

ios - 调用 didEnterBackground 后是否可以在主线程上执行某些操作?

首先,如果您认为我的问题很愚蠢,我想说声抱歉,我是 iOS 和多线程的新手,只想了解事情的进展。据我所知didEnterBackground,这是 iOS 在应用程序暂停之前调用的最后一个函数,应用程序有大约 5 秒的时间从它返回,否则 iOS 将终止应用程序。我目前正在考虑这种情况 - 我有一些任务正在后台线程(例如网络下载)上发生,它的完成块发生在主线程上。像这样

downloadData()当前正在后台线程上运行,用户点击主页按钮,应用程序进入后台并被didEnterBackground调用。而主线程在didEnterBackground downloadData完成下载时执行代码并调用它的完成并将新任务推入主线程队列。那么在这种情况下会发生什么?由于 from 的代码didEnterBackground是在暂停之前可以执行的最后一个代码,所以它的完成块会发生什么downloadData,它是否也会在暂停之前(之后didEnterBackground)执行,或者一旦用户返回应用程序就会执行,或者它会被丢弃吗?或者这种情况根本不可能?感谢您的帮助,如果我的问题不正确,再次抱歉。

0 投票
1 回答
382 浏览

ios - 多个属性的 Swift 中的 Reader Writer Lock 实现

在我的Swift课堂上,我有多个properties. 对于这些属性,我需要创建不同Concurrent Queue的还是可以使用相同的队列?

请建议哪一个会更好。

0 投票
2 回答
43 浏览

ios - 在 iOS 和 ObjC 中,weakSelf 不是总是需要的,对吧?

帮我解决与同事的小争执。在这种情况下不需要弱自我,对吧?

(他不相信我)

0 投票
1 回答
299 浏览

swift - Swift 5 中的引用赋值是原子的吗?

在这种情况下我需要某种显式同步吗?

B类中还有另一种方法:

setA()并且resetA()可以从任何线程以任何顺序调用。

我知道可能存在竞争条件,即如果同时一个线程调用setA()和另一个线程调用resetA(),则结果不确定:val将是0,或1,但我不在乎:无论如何,hasA()将返回 true,不会'是吗?

如果Astruct而不是class,答案会改变吗?

0 投票
1 回答
152 浏览

swift - 如何取消延迟的线程?

我正在执行一组任务,为了随着时间的推移跨越它们,我使用Thread.sleep(forTimeInterval: ... )了它在执行之间添加了暂停。

然后,在主屏幕上我有控制器,可以干预线程执行,所以当控制器应用时我想取消睡眠。并从用户选择的地方开始。所以,我已经尝试过 Thread.exit()了 - 它以错误终止程序。

如何退出(或刷新)当前线程并从我想要的地方开始?按钮(即控制器)控制线程暂停的方法有哪些?

实际发生的是,如果我取消,它会继续从同一个地方运行......

编辑:

例如,cancel()这里做什么?以及为什么exit()不能应用于Thread.current,而只能应用于Thread.

“您可以使用这些语义来取消线程的执行或确定线程是否仍在执行或已完成其任务”。好吧,如果我cancel(). 什么,然后会重新开始

https://developer.apple.com/documentation/foundation/thread

0 投票
1 回答
69 浏览

swift - 如何以线程安全的方式捕获属性

的 A类具有B类的属性,可以重置:

到目前为止,一切都很好。如果我想在多线程场景中使用A类,我必须添加一些同步机制,因为 Swift中的属性本身不是原子的:

但现在我想介绍一个闭包:

我是否正确理解这不是线程安全的?如果我也捕获,这会得到解决lock吗,如下所示?

0 投票
1 回答
49 浏览

swift - `sleep(_:)` vs `asyncAfter(deadline:execute:)`

我有一个值类型,需要相对较长的计算才能生成它(> 1s)。我将此值类型包装在一个枚举中,该枚举表示它是当前正在计算还是可用:

问题是这个值是持久的。这意味着在长时间运行计算之后,当我获得更新的值时,我会尝试先将其持久化,然后再更改对业务逻辑可见的属性。如果持久化成功,则更新属性,如果失败,我想等待,然后再次尝试持久化;有个问题——如果计算的值依赖的任何其他值发生了变化,我们丢弃之前计算的值——停止尝试持久化它——并向Calculation队列提交一个新的操作——重新开始。我最初的尝试是这样的:

我会坚持这一点,但经过进一步研究,我注意到一种普遍的观点,即在DispatchQueueitems 和Operations. DispatchQueue例如,在这种情况下,似乎被认为更好的替代方法是DispatchQueue使用asyncAfter(deadline:execute:).

在我的情况下,该解决方案似乎更复杂,因为能够取消封装所有需要完成的所有操作的单个操作使得取消变得容易。我可以保留对最后Calculation执行的操作的引用,如果在主线程上提交另一个操作,而另一个操作正在进行时,我取消旧的,添加新的,这样我就知道旧的值不会持久化,因为它是在执行取消后在主线程上完成的;并且Calculation不得取消 a 以使其保持其结果。

在这种情况下,是否有一些事情DispatchQueues可以OperationQueues使替代解决方案更直接地实施?还是睡在这里完全没问题?