问题标签 [nslock]

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 回答
6245 浏览

iphone - IOS SDK - NSLock 消息:“从没有锁定它的线程中解锁”

我使用 NSLock 遇到此错误,我试图通过使用 unlockWithCondition (使用 NSConditionLock)来规避它,但无论我得到相同的结果:

* 中断 _NSLockError() 以进行调试。* -[NSLock unlock]:锁('(null)')从没有锁定它的线程解锁。

我不确定它是否不好,但我正在做的是:

所以“..shared code..”部分可以执行。我不明白为什么我会收到此错误。

谁能解释我做错了什么?看起来它应该可以完美运行。

0 投票
3 回答
795 浏览

c++ - 如何在 iOS 应用程序中锁定代码执行

问题描述

StdString ShowLockScreen()在这个函数中有一个函数我调用activateViewController函数显示一些用户必须输入 PIN 的 UI,就在调用activateViewController函数之后我想锁定所有进程,直到用户输入他的 PIN 并在打开的 UI 上按 OK 按钮。下面你可以看到我尝试的代码

iOS 中的源代码

我希望我的代码停止然后我打电话[theLock lock];,然后我会打电话 [theLock unlock]; 从我的 UI 和代码将继续执行。但它在我的情况下不起作用。

Android中的源代码

我在 Android 中编写了类似的应用程序,这里是代码。我想在 iOS 中写同样的东西,但我找不到解决方案

研究

我想我必须使用

但是如何在我的代码中使用它?

0 投票
2 回答
2911 浏览

objective-c - 使队列线程安全

我有一个相机会话,我正在从缓冲区中拍摄图像:

我在图像上应用过滤器,我希望它在另一个队列上应用过滤器,它不是线程安全的,所以如果我快速拍摄图像,它会将图像混合在一起(从左到右 50/50,我认为),但我试图使其成为线程安全的,并且使用NSLock或 NSRecursiveLock 将无法工作,因为它将图像混合在一起。

有人能帮我吗?我对如何使代码成为线程安全的知识不多

图像混合如下:http: //i.stack.imgur.com/wjrIl.png

0 投票
1 回答
747 浏览

objective-c - @synchronized 锁定 iVar 和/或属性?

可能重复:
@synchronized() 做什么?

我有一个关于什么@synchronized真正起作用以及什么最适合我的应用程序的问题。

我有一个NSMutableArray我将在后台线程中变异并在前台线程中访问。如果我在改变它的内容时访问数组,如果这意味着我可以从背景突变中获取更新的值,我希望对访问数组有一点控制。但是,我不能 100% 确定NSLocks 和 s 的@synchronized具体工作方式。

如果这是不可能的,是否可以改变数组的副本,完成后,在设置副本的内容时锁定属性/实例变量,以冻结任何访问器调用?

基本上,@synchronized(myArray) 会冻结任何访问器调用(让调用挂起,直到锁释放然后执行)?

此外,是否可以使用 NSLock 锁定实例变量或属性?从我所见,它似乎只锁定代码块。

0 投票
2 回答
591 浏览

ios - 从多个 UIViewController 控制对 webservice 方法的访问

我有一个带有标签栏和 3 个不同的 iOS 应用程序,UIViewControllers每个标签一个。该应用程序使用 SudzC 与 a 交互以C# .NET webservice从数据库中提取数据。

从所有三个视图控制器调用一个 web 服务方法,但我想强制只有一个视图控制器可以在任何时间点调用该方法,并且在返回数据之前没有其他视图控制器可以调用它。

我试图通过在 NSLock 中定义一个 NSLock 来解决这个问题AppDelegate,然后在每个中实现以下代码viewController

Web 服务返回的处理程序定义为(为清楚起见截断)

我的理解是第一个UIViewController会获得锁,而其他人会阻塞长达 30 秒以等待获得锁。但是,在极少数情况下,不止一个人同时viewController尝试访问锁,我会立即收到以下错误:

谁能告诉我我做错了什么?我对 C/C++ 中的锁有很好的理解,但是这些 Objective-C 锁被难住了。

0 投票
1 回答
10802 浏览

ios - 如何在特定线程上锁定 NSLock

我有财产@property NSLock *myLock

我想写两种方法:

myLock这些方法分别锁定和解锁无论是什么线程或队列调用它们,它们都需要执行此操作。例如,线程 A 可能已经调用lock,但队列 B 可能是调用的那个unlock。这两种方法都应该正常工作,而不会报告我正在尝试从锁定它的不同线程/队列中解锁锁。此外,他们需要同步执行此操作。

0 投票
2 回答
1142 浏览

ios - NSRecursiveLock 释放

我有一个带有多个视图控制器并启用了 ARC 的 iOS 应用程序。其中一个视图控制器有一个IBOutletforUIScrollViewUIPageControl. 加载该视图控制器时,控制台中会打印此错误:

在尝试解决问题时,我为符号设置了一个符号断点,_NSLockError并将模块设置为 Foundation。"0x12d2b58: pushl %ebp"现在 Xcode在线程 1上以断点 1.1 中断。

这是我的应用程序中有问题的 ViewController 的代码:

头文件(.h):

实施文件(.m):

在 (lldb)bt 之后:

我的问题是为什么NSRecursiveLock首先被解除分配?

我从未在代码中提及NSRecursiveLock任何地方。关于这个有一个类似的问题,但不是很详细。

ARC在这里发挥作用吗?

0 投票
1 回答
1733 浏览

ios - 如何执行等待动画完成的锁?

我正在实现一个通过用户输入动画的健康栏。

这些动画使其上升或下降一定量(比如 50 个单位),并且是按下按钮的结果。有两个按钮。增加和减少。

我想在健康栏上执行锁定,以便一次只有一个线程可以更改它。问题是我遇到了僵局。

我猜是因为一个单独的线程运行一个由另一个线程持有的锁。但是当动画完成时,那个锁就会让位。如何实现在 [UIView AnimateWithDuration] 完成时结束的锁?

我想知道是否NSConditionLock可行,但如果可能的话,我想使用 NSLocks 以避免不必要的复杂性。你有什么建议吗?

(最终我想让动画“排队”,同时让用户输入继续,但现在我只想让锁工作,即使它首先阻止输入。)

(嗯,想想看,同一个 UIView 一次只有一个 [UIView AnimateWithDuration] 运行。第二个调用将中断第一个调用,导致完成处理程序立即为第一个运行。也许第二个锁在首先有机会解锁。在这种情况下处理锁定的最佳方法是什么?也许我应该重新访问 Grand Central Dispatch 但我想看看是否有更简单的方法。)

在 ViewController.h 我声明:

在 ViewController.m 我有:

在加载视图中:

ViewController.m 的其余部分(相关部分):

输出:

复制说明:点击“减少”一次

触摸线程按钮1..

tryTheLock beforeLock .. 免费。

tryTheLock afterLock.. 锁定。开始动画块 - 值:250 结束动画块 - 值:250 - 完成:是

tryTheLock beforeUnlock .. 锁定。

tryTheLock afterUnlock .. 免费。

结论:这按预期工作。

--

输出:

重现说明:快速点击“减少”两次(中断初始动画)..

触摸线程按钮1..

tryTheLock beforeLock .. 免费。

tryTheLock afterLock.. 锁定。BEGIN animationBlock - val: 250 touchThreadButton1..

tryTheLock beforeLock.. 锁定。 * -[NSLock lock]: deadlock ( '(null)') * Break on _NSLockError() 进行调试。

结论。死锁错误。用户输入被冻结。

0 投票
0 回答
253 浏览

objective-c - 用于填充 NSTableView 的后台线程的最佳设计模式

我正在尝试创建后台线程以获取核心数据以填充 NSOutlineView。该操作可能需要几秒钟,所以我想将操作放在后台线程中并向用户显示 UI,如下所示。随着每个部分的搜索完成,我正在主线程上调用一个函数来重新加载该部分的数据。这似乎工作正常,但我有一个实例,在核心数据获取操作期间引发了异常。用户真的不能做任何其他事情,所以我认为在后台线程上进行核心数据调用可能是可以的,只要同时没有其他东西可以这样做。随后,我在代码周围使用了 NSLock 来更新保存数据以供显示的数组。我现在似乎无法引起任何异常。

在此处输入图像描述

我使用的基本方法在下面的代码片段中进行了说明,如下所示: 1.initWithNibName填充初始数据以进行显示 2.awakeFromNib设置 outlineView 并启动后台线程以获取第一组数据 3. 运行更新共享对象时的后台线程和阻塞 4. 当线程完成时触发在主线程上执行一个函数,以 a) 重新加载 outlineView(希望我知道如何只重新加载 NSOutlineView 的部分),以及 b) 踢下一部分提取的后台线程。

一般来说,这似乎工作正常,并且似乎为用户创造了更好的视觉体验,而不是简单地在主线程上运行它并观看彩色雨伞旋转几秒钟......

任何人都可以确认这是否是一种强大的方法 - 我不确定我是否完全理解 NSLock 的作用,我怀疑这种方法可能存在一些漏洞,但似乎无法打破它。

0 投票
1 回答
4949 浏览

objective-c - 没有正确使用 NSLock,但似乎仍然有效

我遇到了线程安全问题。我有一个队列,当我修改内容时会导致跨线程出错。我以前没有用过锁,但我想我试试。我在所有为我的队列操作支持 NSMutableArray 的代码周围添加了一个锁。我认为,问题在于我没有为所有人使用相同的锁。我在每个修改数组的方法中创建了一个新的 NSLock 实例。我假设我应该使用一个 NSLock ivar 来保护阵列。但我的困惑来自于我添加它后它就起作用了。下面是一个示例。我假设在任何地方我创建了一个新的 NSLock,我应该只使用一个 ivar NSLock。我认为这段代码只是将入队锁定在其他入队和出队对其他出队而不是入队对出队。澄清会很棒。