gpt4 book ai didi

iphone - 线程、优先级和放弃

转载 作者:行者123 更新时间:2023-12-03 16:49:05 25 4
gpt4 key购买 nike

我最近对 ​​iOS 的线程感到好奇。请指出您将采取的方向,以在现代 iOS 设备上实现(如果可能)以下目标...谢谢!

用户正在输入文本,每隔几秒说一个单词。

我有时想启动 DifficultProcess 来进行一些语义处理。简而言之,我想我需要能够做四件事:

  • 从main启动DifficultProcess
  • 如果 DifficultProcess 完成,则从它返回一条消息到同一个 main
  • 如果我愿意,可以从 main 中放弃、摆脱 DifficultProcess
  • 最后是优先级问题:DifficultProcess 的优先级必须比主输入或用户输入低得多,我希望 DifficultProcess 具有非常低的优先级;这可能吗?

本质上,在现代(2011)(1 月下旬)iOS 中对 A、B、C 的调用是什么?我不在乎爸爸的手段! “D”是否有可能以任何方式存在?

我想这就是四个想法!

因此,我特别想向正在运行的后台进程发送一条消息,换句话说,调用一个例程(这样,如果需要,可以终止正在运行的后台进程,或者更改它的模式操作等)。

(对于 1997 年之前出生的任何人,您都会认识到这是典型的“推测性处理”范例。)

感谢任何对此感到困扰的人的指点!

最佳答案

我建议使用 NSOperation 和 NSOperationQueue 来管理您需要能够任意取消的后台事件。

NSOperation 的 -cancel 和 NSOperationQueue 的 -cancelAllOperations 是值得关注的方法。

要将消息从后台返回到主线程,dispatch_async-to-main-thread-queue 技术就很好。您可以将其与 NSOperation 的委托(delegate)协议(protocol)结合起来,以编码您要发回的消息。

例如

@protocol MyOperationDelegate
- (void) operationStarted:(MyOperation *)operation;
- (void) makingProgressOnItem:(id)anItem otherInterestingItem:(NSDictionary *)otherItem remainingCount:(NSUInteger)count;
- (void) operationWillFinish:(MyOperation *)operation;
@end

@interface MyOperation
id <MyOperationDelegate> delegate;
@end

@implementation MyOperation
...

- (void) cancel
{
[super cancel];

// Tell the delegate we're about to finish (due to cancellation).
dispatch_sync (dispatch_get_main_queue(), ^{
[self.delegate operationWillFinish:self];
});
}

- (void) main
{
// Check for cancellation

if (self.isCancelled) return;

// Starting

dispatch_sync (dispatch_get_main_queue(), ^{
[self.delegate operationStarted:self];
});

if (self.isCancelled) return; // Another cancel check


// Send async progress messages periodically while doing some work

while (workNotDone)
{
// Do some work ...

dispatch_async (dispatch_get_main_queue(), ^{
[self.delegate makingProgressOnItem:foo otherInterestingItem:bar remainingCount:baz];
});

if (self.isCancelled) return;
}


// About to finish

if (!self.isCancelled) {
dispatch_sync (dispatch_get_main_queue(), ^{
[self.delegate operationWillFinish:self];
});
}
}
@end
<小时/>

KVO 不利于线程间通信;在发起键值更改的线程上接收观察结果。因此,如果您的后台线程更改了某个值,您的后台线程将收到有关该值的 KVO。可能不是您想要的。

Grandpa 的 -performSelectorOnMainThread:withObject:waitUntilDone: 仍然是将消息返回到主线程的好方法。限制是您的消息只能访问一个基于对象的参数。主线程的dispatch_async没有这个限制。

如果你想从后台线程向主线程触发异步(或同步)NSNotification,则需要使用-performSelectorOnMainThread。

NSNotification *note = [NSNotification notificationWithName:FinishedABunchOfWorkNotification object:self userInfo:nil];
[[NSNotificationCenter defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:note waitUntilDone:YES];

关于iphone - 线程、优先级和放弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4741568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com