class SomeViewController: UIViewController {
let semaphore = DispatchSemaphore(value: 1)
deinit {
semaphore.signal() // just in case?
}
func someLongAsyncTask() {
semaphore.wait()
...
semaphore.signal() // called much later
}
}
Run Code Online (Sandbox Code Playgroud)
如果我告诉信号量等待,然后在信号量被告知发出信号之前取消初始化拥有它的视图控制器,则应用程序会因错误而崩溃Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)。但是,如果我只是调用视图控制器的方法,就可以避免灾难semaphore.signal()。deinit但是,如果异步函数在deinit调用之前返回并且视图控制器被取消初始化,则signal()调用两次,这似乎没有问题。但这样做安全和/或明智吗?
随机且看似没有任何明显模式,我在应用程序启动时收到以下错误,该错误永远不会超过启动屏幕:
2020-09-11 11:38:36.809281-0700 Pineapple[5448:1115742] [DYGLInitPlatform] connection to host has failed: Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"
2020-09-11 11:38:36.811548-0700 Pineapple[5448:1115742] aborting: platform initialization failed
Run Code Online (Sandbox Code Playgroud)
线程列表:
(lldb) thread list
Process 5448 stopped
thread #1: tid = 0x1105df, 0x000000019e76377c libsystem_kernel.dylib`__ulock_wait + 8, queue = 'com.apple.main-thread'
* thread #2: tid = 0x11065e, 0x000000019e762d88 libsystem_kernel.dylib`__pthread_kill + 8, stop reason = signal SIGABRT
thread #3: tid = 0x11065f, 0x000000019e763940 libsystem_kernel.dylib`__workq_kernreturn + 8
Run Code Online (Sandbox Code Playgroud)
线程回溯:
(lldb) thread backtrace
* thread #2, stop reason = signal SIGABRT …Run Code Online (Sandbox Code Playgroud) 是NSKeyedArchiver适当的转换UIImage来Data?
do {
let data = try NSKeyedArchiver.archivedData(withRootObject: UIImage(named: somePath), requiringSecureCoding: true)
...
} catch {
print(error)
}
Run Code Online (Sandbox Code Playgroud)
或者是矫枉过正,使用pngData()更合适?
let image = UIImage(named: somePath)
let data = image?.pngData()
Run Code Online (Sandbox Code Playgroud)
以及如何从UIImageHEIF / HEIC转换Data?
目标是将图像保存到设备的文件系统。
由于每个调度队列都会消耗线程资源,因此创建额外的并发调度队列会加剧线程消耗问题。将任务提交到全局并发调度队列之一,而不是创建专用并发队列。对于串行任务,请将串行队列的目标设置为全局并发队列之一。这样,您可以维护队列的序列化行为,同时最大限度地减少创建线程的单独队列的数量。
https://developer.apple.com/documentation/dispatch/dispatchqueue
当文档说DispatchQueue通过将队列的目标设置为全局并发队列来创建串行时,这是他们的意思吗?
let q = DispatchQueue(label: "someSerialQueue", qos: .default, attributes: [], autoreleaseFrequency: .inherit, target: .global())
Run Code Online (Sandbox Code Playgroud)
另外,这真的比简单地标记它更可取吗:
let q = DispatchQueue(label: "someSerialQueue")
Run Code Online (Sandbox Code Playgroud) DynamoDB 在每个应用程序一个表的情况下运行效果最佳 ( https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-general-nosql-design.html ),但 AppSync 默认情况下打破了该规则从 GraphQL 模式自动生成代码(AWS 建议用户允许 API 执行此操作)。因此,要在坚持 DynamoDB 最佳实践的同时将 AppSync 与 GraphQL 结合使用(假设 DynamoDB 是 GraphQL API 的唯一数据源),这种方法是否有效?
首先,创建一个空白 DynamoDB 表(TheTable在此示例中)并为其指定分区键 ( partitionKey) 和排序键 ( sortKey)。
其次,手动强制每个 GraphQL 类型都由该表支持 ( TheTable)。这就是 AppSync 自动代码生成将走向另一个方向的地方。
GraphQL 架构:
type Pineapple {
partitionKey: String!
sortKey: String!
name: String!
}
# create varying types as long as they all map to the same table
type MachineGun {
partitionKey: String!
sortKey: String!
name: String!
}
input …Run Code Online (Sandbox Code Playgroud) amazon-web-services amazon-dynamodb graphql aws-appsync aws-amplify
我对通过 FCM 实现云消息传递感到困惑。要向 iOS 设备发送远程(推送)通知,APN 需要 iOS 设备令牌。但是,Firebase 应用程序不与 APN 交互,而是与 FCM 交互,FCM 与 APN 交互。但要通过 FCM 向任何客户端发送推送通知(或消息)需要 FCM 令牌。这是否意味着 Firebase 应用不需要 iOS 设备令牌即可向 iOS 设备发送推送通知?
为什么self在类中需要声明的结构中不需要声明?我不知道是否还有其他例子说明了这种情况,但在转义闭包的情况下,确实如此。如果闭包是非可选的(因此是非转义的),则不需要self在两者中的任何一个中声明。
class SomeClass {
let someProperty = 1
func someMethod(completion: (() -> Void)?) {}
func anotherMethod() {
someMethod {
print(self.someProperty) // declaring self is required
}
}
}
struct SomeStruct {
let someProperty = 1
func someMethod(completion: (() -> Void)?) {}
func anotherMethod() {
someMethod {
print(someProperty) // declaring self is not required
}
}
}
Run Code Online (Sandbox Code Playgroud) 如何将 KVO 通知与线程安全结合起来?我有一个类需要符合 KVO 标准,这就是我目前的做法:
class CustomOperation: Operation {
private let stateQueue = DispatchQueue(label: "customOperation", attributes: .concurrent)
private var _isExecuting = false
override var isExecuting: Bool {
get {
return stateQueue.sync { _isExecuting }
}
set {
stateQueue.async(flags: .barrier) {
self._isExecuting = newValue
}
}
}
override func start() {
willChangeValue(forKey: "isExecuting")
isExecuting = true
didChangeValue(forKey: "isExecuting")
}
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样在属性设置器内移动通知吗?
class CustomOperation: Operation {
private let stateQueue = DispatchQueue(label: "customOperation", attributes: .concurrent)
private var _isExecuting = false
override var isExecuting: …Run Code Online (Sandbox Code Playgroud) 我在WordPress上使用静态首页构建了一个自定义主题,并且在"设置">"阅读设置">"首页"中没有设置页面显示为帖子页面.我想根据不同静态页面上整个网站的类别来显示帖子.因此,我永远不会通过控制台声明帖子索引页面.所以我使用$ wp_query函数.
如何在此脚本中添加过滤器,仅显示"apples"类别中的帖子(例如)?现在,此脚本显示所有帖子,无论类别如何.
<?php
$temp = $wp_query;
$wp_query = null;
$wp_query = new WP_Query();
$wp_query->query('showposts=1' . '&paged='.$paged);
while ($wp_query->have_posts()) : $wp_query->the_post();
?>
<h2><a href="<?php the_permalink(); ?>" title="Read"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>
<?php the_date(); ?>
<?php endwhile; ?>
<?php if ($paged > 1) { ?>
<p><?php previous_posts_link('Previous page'); ?>
<?php next_posts_link('Next page'); ?></p>
<?php } else { ?>
<p><?php next_posts_link('Next page'); ?></p>
<?php } ?>
<?php wp_reset_postdata(); ?>
Run Code Online (Sandbox Code Playgroud) 此问题适用于不使用nib文件的仅编程应用程序,其中已删除故事板并创建窗口并在应用程序委托中提供根视图.我在这里读到的一些可接受的答案似乎与Apple的文档有冲突,所以请告诉我这是否正确:
在创建a时UIViewController,应该放置创建其基础的方法loadView 而不调用super.loadView:
override func loadView() {
// build something
buildSomething()
}
Run Code Online (Sandbox Code Playgroud)
这使最后的润色的方法应该放在viewDidLoad 与调用super.viewDidLoad:
// view did load
override func viewDidLoad() {
super.viewDidLoad()
// arrange something that requires it be built first
arrangeSomething()
}
Run Code Online (Sandbox Code Playgroud)
或者super.viewDidLoad()只应在特殊情况下调用?如果是这样,他们是什么?