问题标签 [nscondition]

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 投票
2 回答
1269 浏览

objective-c - NSCondition:递归锁定?

我正在创建一个阻塞队列,由大约 10 个工作线程同时访问。队列的基本实现是这样的:

_mutex一个在哪里NSCondition。问题来自-isEmpty-size方法:

因为它们需要对互斥锁进行锁定以确保没有数据损坏,所以它会使程序陷入死锁,因为NSCondition不会递归锁定。但是,如果我将实现更改为以下内容:

然后程序不会死锁,但是,当我重新获得锁时,另一个工作人员已经将我需要的对象出队。关于如何进行NSCondition递归的任何想法?

0 投票
2 回答
3999 浏览

ios - iOS - Objective-C - 如何在等待时停止 NSThread?

我有一个 nsthread,其中有一个 while 循环。它从 main 方法中的“线程安全”队列中获取对象。当我离开包含这个 nsthread 对象的 UIViewController 时,我调用了 nsthread cancel 方法,但它并没有停止,因为它被“queueLock”NSCondition 锁定。当我回到这个 UIViewController 时,将创建一个新的 nsthread 并从队列中获取对象,但是前一个线程仍然退出并且它们都尝试使用队列中的同一个对象,这会导致内存管理问题。我的问题是当我离开 UIViewController 时应该如何停止这个线程。

NSThread 主要方法:

这是队列类的get方法:

谢谢!

0 投票
1 回答
1879 浏览

objective-c - 如何在objective-c中的指定时间唤醒线程

我在objective-c中编写一个ssh包装器,我正在尝试实现一个命令应该执行的maxTime。我实现它的方式是:

主线:

  1. 计算超时
  2. 创建 asyncThread(GCD 队列)执行命令并解析返回的数据
  3. 等待超时或信号
  4. 返回结果

异步线程:

  1. 执行命令
  2. 获取返回的数据
  3. 如果接收到正确的数据信号 MainThread

在 C# 中,我使用 ManualResetEvents 向 MainThread 发出信号,取得了很大的成功。在 Objective-C 中,我能找到的最接近的类是 NSCondition,但它似乎不是为线程间通信而构建的。

事实上我得到:

2012-05-22 00:31:05.761 libssh2-for-iOS[60821:11303] ** -[NSCondition unlock]: 条件 ('(null)') 从未锁定的线程中解锁

2012-05-22 00:31:05.763 libssh2-for-iOS[60821:11303] ** 中断 _NSLockError() 以进行调试。

当我尝试使用它时。是否有另一种使用 NSCondition 的方法或更好的方法让线程休眠,直到它收到某种信号?

0 投票
1 回答
841 浏览

ios - NSCondition - 多线程

我知道以下是您应该如何使用 NSCondition:

方法一:

方法二:

我想要的只是使用一个可以从不同线程锁定和解锁的简单锁,所以我知道我需要为此使用 NSCondition ,并且苹果文档说即使你不检查条件也需要格外小心不要在逻辑上使用它(来自苹果文档:“为了避免这些虚假信号引起的问题,您应该始终将谓词与条件锁结合使用”)。

方法之间存在依赖关系,但它是双向的,这意味着在另一个方法释放锁之前,没有人可以完成他们的工作(这可能会在从锁定它的方法)。

  1. 是否可以等待两种方法的条件并在两种方法结束时发出信号?

  2. 如果我有 3 个 method1 线程同时等待,它们将以什么顺序进入工作主体?我想这是他们进入等待的顺序,对吗?

0 投票
3 回答
2507 浏览

objective-c - 关闭与 iOS 6.0 GM 的会话时出现 EAAcessory 错误

有一个 MFI 设备通过蓝牙 (2.1 + EDR) 连接到 iPhone 4S (6.0 GM) 或 iPad (6.0 GM)。该项目基于 Xcode 4.5 GM 构建。当应用程序获取EAAccessoryDidDisconnectNotification时,它将发送消息[_eaSessionController closeSession];。所有这些都在 iOS 5.1.1 或更早版本中运行良好。但是在带有此消息的 iOS6 上,我得到的日志如下:

有任何想法吗?

0 投票
1 回答
242 浏览

iphone - 如何等待 NSURLConnection 的某个状态

很抱歉打扰另一个 NSURLConnection 问题,在这里已经增加了一千多个。

场景如下。在使用动态加载的增强现实功能的 iPhone 应用程序中,会提示用户下载新的 AR 模型,因为这些模型可用。模型可能有几 MB 大,因此在决定下载之前,应向用户指示要下载的所有模型的总大小。

为了找出每个文件有多大,我想使用异步 NSURLConnection,但是一旦我得到响应([NSURLResponse expectedContentLength])就停止下载。我可以在委托的 connection:didReceiveResponse: 方法中执行此操作。

我的问题是,我怎样才能等到这种情况出现?如何设置 NSURLConnection,让它异步启动,然后等到 connection:didReceiveResponse: 方法被调用?我尝试使用 NSCondition,在设置 NSURLConnection 并在 connection:didReceiveResponse: 方法中发出条件信号后让它等待。但这所做的只是冻结了主线程。有任何想法吗?

0 投票
1 回答
3418 浏览

ios - 使用 NSCondition 等待异步方法

我正在通过互联网异步下载四个 plist 文件。我需要等到所有四个文件都下载完毕,直到我在第一次运行时推送 UIViewController,或者在所有后续运行时刷新数据并重新加载我的所有 UITableViews。

在第一次运行时,一切正常。刷新时,所有四个 url 请求都被调用并启动,但从不调用它们的完成或失败块,并且 UI 冻结。这很奇怪,因为我在后台线程中执行所有操作。我一直无法弄清楚为什么会这样。

第一次加载和刷新方法调用四个“更新”方法的方式相同,使用NSCondition的方式相同。

第一次运行:

刷新数据时:

上面每个加载方法中出现的下面的块对应于将下载和更新特定数据的方法。

运行:

并且完成和失败块调用相同的方法来更新数据

那么,为什么这在第一次运行时有效,但在任何后续运行中都无效?

0 投票
0 回答
29 浏览

cocoa-touch - 将异步调用的结果返回给调用它的方法

我正在为我现在正在开发的应用程序编写一个标准的 NSURLConnection 类,我希望它也能够使用后续的应用程序。

这个想法是能够将 URL 和参数数组传递给此类中的方法,该方法将启动连接,然后在连接完成后返回结果。

由于我是从另一个类调用它,我希望能够将结果设置为该调用类中的一个变量。

问题是结果没有立即到达,所以当我返回我在“go”方法中设置的 NSData 时,它是空白的。

我尝试了一些方法,例如 NSCondition 并在 go 方法中的另一个线程上运行 while 循环以检查它是否已完成。

不幸的是,我事先并不知道这一点,来自 NSURLConnections 的异步连接运行在与运行“go”方法中的 NSCondition 相同的线程上。因此,当我锁定该方法以使其没有提前返回时,我也锁定了我的连接,因此它从未达到它的完成回调。

如何有效地暂停我的“go”方法足够长的时间以完成连接,以便我可以将数据返回到我的应用程序中的任何位置。

我有可能以完全错误的方式解决这个问题,所以如果是这种情况,请告诉我。它确实需要像这样工作,因为多个请求将同时发出,我希望这个连接类的不同实例能够控制它们。

0 投票
2 回答
1812 浏览

ios - 暂停主线程,直到后台线程检索到用户输入

在我的主启动线程中,我需要暂停代码并启动一个新线程并等到我得到用户输入。然后我想丢弃新创建的线程并回到主线程停止的地方。但是发生的事情是调用了新线程,但主线程继续执行代码。如何在不干扰用户使用界面按钮的情况下处理这个问题?我认为可能需要在我的 if(moveCount == 2) 语句中创建另一个 nscondition?或者我的主线程需要等待来自我的另一个线程的信号,通知用户输入被接收。

附加说明:我还希望原始线程以这样的方式暂停,以便我仍然可以在我的界面中使用我的 2 个 UIButton。

关于我收到的问题的更多附加说明:这是我正在制作的游戏。在我的一种方法中,中间代码的某个地方意味着在我的主线程中。这种方法决定了我向哪个方向移动,然后我得到一个标签差异,然后进行攻击。但有时可以进行 2 次攻击,因此此时用户可以在屏幕上单击 2 个按钮来决定进行哪种攻击。

我也很清楚,我现在不应该暂停主线程。如果是这样,还有什么选择?谢谢

NSCondition 和 NSThread

在我的 viewDidLoad 中创建以下内容。

代码中间的某个地方..

线程方法

0 投票
2 回答
630 浏览

ios - 如何使用 NSConditionLock 在 iOS 单元测试中等待异步操作

我有一个单元测试,我需要等待异步任务完成。我正在尝试使用 NSConditionLock,因为它似乎是一个非常干净的解决方案,但我无法让它工作。

一些测试代码:

我试图在这里遵循解决方案: 如何对异步 API 进行单元测试?

如果我锁定,我的代表永远不会被调用。如果我取出锁码并放入一个简单的计时器,它就可以正常工作。

我是否锁定了整个线程并且不让登录代码运行并实际进行异步调用?

我也尝试过将登录调用放在不同的线程上,这样它就不会被锁定。

我究竟做错了什么?

编辑添加登录代码。为了可读性,修剪了代码。基本上只需使用 AFNetworking 来执行 POST。完成后将调用委托方法。登录发出http请求: