在Objective C中是否有一种标准的好方法来调用具有超时的阻塞方法?我希望能够做到:
// call [something blockingMethod];
// if it hasn't come back within 2 seconds, forget it
Run Code Online (Sandbox Code Playgroud)
谢谢。
无法中断未设计为中断的功能。这样做通常会导致数据损坏和资源泄漏。
实现您所描述的标准方法是重新设计blockingMethod,使其接受超时或其他取消机制。
如果这是不可能的,并且需要超时blockingMethod,标准方法是派生子进程运行blockingMethod,如果它没有在超时前完成,则将其终止(通常通过发送 SIGTERM)。这在 ObjC 中实现有些复杂,您还需要实现一种将结果发送回父进程的机制。由于操作系统在进程级别管理资源(内存、文件句柄等),因此强制中断功能的唯一方法是为其创建单独的进程。这仍然会导致数据损坏,具体取决于什么blockingMethod,但它可以解决更多的问题。
请注意,通常不可能从 iOS 上的非 Apple 代码分叉进程,因此无法在那里完成。
作为我所说的“数据损坏”的一个例子,考虑一些简单的代码,如:
[self.cache lock];
[self.cache removeObject: object];
[self.cache decrementCountOfObjects];
[self.cache unlock];
Run Code Online (Sandbox Code Playgroud)
现在想象一下这个过程在这个操作中间被强行终止了。应该发生什么?缓存是如何解锁的?缓存内容和计数如何协调?甚至有可能对象正在被复制;然后呢?除非blockingMethod在编写时考虑到取消,否则系统将如何自动处理所有这些问题?
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |