- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找不到关于如何子类化 NSOperation
的好的文档并发并支持取消。我阅读了 Apple 文档,但找不到“官方”示例。
这是我的源代码:
@synthesize isExecuting = _isExecuting;
@synthesize isFinished = _isFinished;
@synthesize isCancelled = _isCancelled;
- (BOOL)isConcurrent
{
return YES;
}
- (void)start
{
/* WHY SHOULD I PUT THIS ?
if (![NSThread isMainThread])
{
[self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
return;
}
*/
[self willChangeValueForKey:@"isExecuting"];
_isExecuting = YES;
[self didChangeValueForKey:@"isExecuting"];
if (_isCancelled == YES)
{
NSLog(@"** OPERATION CANCELED **");
}
else
{
NSLog(@"Operation started.");
sleep(1);
[self finish];
}
}
- (void)finish
{
NSLog(@"operationfinished.");
[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
_isExecuting = NO;
_isFinished = YES;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
if (_isCancelled == YES)
{
NSLog(@"** OPERATION CANCELED **");
}
}
isCancelled
标志没有被修改,即使我已经调用
cancelAllOperations
.
最佳答案
好的,据我所知,您有两个问题:
performSelectorOnMainThread:
吗?出现在代码注释中的段?这段代码有什么作用? _isCancelled
调用 cancelAllOperations
时不会修改标志在 NSOperationQueue
包含这个操作? NSOperation
被称为
MyOperation
,只是为了方便解释。我会解释你的误解,然后给出一个更正的例子。
NSOperation
s 带有
NSOperationQueue
,从你的代码来看,这听起来像是你在做什么。在这种情况下,您的
MyOperation
无论
-(BOOL)isConcurrent
是什么,都将始终在后台线程上运行方法返回,因为
NSOperationQueue
s 明确设计为在后台运行操作。
-[NSOperation start]
方法,因为默认情况下它只是调用
-main
方法。那是您应该覆盖的方法。默认
-start
方法已经处理设置
isExecuting
和
isFinished
在适当的时候为您服务。
NSOperation
要在后台运行,只需覆盖
-main
方法并将其放在
NSOperationQueue
上.
performSelectorOnMainThread:
在您的代码中会导致
MyOperation
的每个实例始终在主线程上执行其任务。由于一次只能在一个线程上运行一段代码,这意味着没有其他的
MyOperation
s 可能正在运行。
NSOperation
的整个目的和
NSOperationQueue
是在后台做一些事情。
MyOperation
时需要更新 UI完成,这就是你应该使用
performSelectorOnMainThread:
的时候.我将在下面的示例中展示如何做到这一点。
-[NSOperationQueue cancelAllOperations]
调用
-[NSOperation cancel]
方法,这会导致后续调用
-[NSOperation isCancelled]
返回
YES
.
然而 ,你做了两件事来使这无效。
@synthesize isCancelled
覆盖 NSOperation 的 -isCancelled
方法。没有理由这样做。 NSOperation
已经实现 -isCancelled
以完全可以接受的方式。 _isCancelled
用于确定操作是否已被取消的实例变量。 NSOperation
保证[self isCancelled]
将返回 YES
如果操作已被取消。确实如此 不是 保证您的自定义 setter 方法将被调用,也不保证您自己的实例变量是最新的。你应该检查 [self isCancelled]
// MyOperation.h
@interface MyOperation : NSOperation {
}
@end
// MyOperation.m
@implementation MyOperation
- (void)main {
if ([self isCancelled]) {
NSLog(@"** operation cancelled **");
}
// Do some work here
NSLog(@"Working... working....")
if ([self isCancelled]) {
NSLog(@"** operation cancelled **");
}
// Do any clean-up work here...
// If you need to update some UI when the operation is complete, do this:
[self performSelectorOnMainThread:@selector(updateButton) withObject:nil waitUntilDone:NO];
NSLog(@"Operation finished");
}
- (void)updateButton {
// Update the button here
}
@end
isExecuting
执行任何操作,
isCancelled
, 或
isFinished
.这些都是自动为您处理的。只需覆盖
-main
方法。就这么简单。
NSOperation
,因为
-[MyOperation isConcurrent]
将返回
NO
如上所述。但是,它将在后台线程上运行。真正的
isConcurrent
方法应该命名为
-willCreateOwnThread
,因为这是对方法意图的更准确描述。)
关于iphone - 将 NSOperation 子类化为并发和可取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3859631/
是否可以使用标准输入/标准输出在 bash 中压缩/解压缩字符串? 我试过了,但显然不支持它? hey=$(echo "hello world" | gzip -cf) echo $hey # ret
我的任务是让一个企业网站适用于 IE7,它必须“足够好”,因此我禁用了任何导致问题的花哨/非必要功能。 其中之一是正在使用的搜索栏,需要进行哪些搜索,我猜测幕后某个地方有某种 JavaScript 用
我有一个执行大量处理的小程序。您可以通过按回车键打印进度。 我实现它的方法是在主线程中完成处理,同时我有一个 pthread 不断循环 getchar() 以等待输入键。 问题是当我完成处理时。发生这
我完全理解 suspendCoroutine 与 suspendCancellableCoroutine 在我的示例中的工作方式。但我想知道为什么 println("I finished") (第 1
我是 QT 的新手。目前在我的项目中我实现了 QFileDialog . 在我的用例中:每当用户选择一个文本文件时,它都会执行 functionA .但是,我发现如果在文件对话框中单击取消,funct
我有代码,仅在用户选择“另存为”时运行。为此并获取我正在使用的文件的新名称 Application.GetSaveAsFilename功能。 我遇到的问题是类型不匹配,同时检查用户是否在他没有这样做时
我的 UILocalNotification 有问题。 我正在用我的方法安排通知。 - (void) sendNewNoteLocalReminder:(NSDate *)date alrt:(NS
祝你有美好的一天 我有一个网站,其中有很多“工具提示”。这些工具提示是在将鼠标悬停在文本的特定部分上时创建的。工具提示是一个 div block ,它显示在网站上所有其他内容的顶部,并且当光标从文本移
我遇到以下问题。每隔 2 秒,程序就会进入 if 语句。在这个 if 语句中,我想要一个计时器,它会在 15 秒后给我一条消息。计时器应延迟 1 秒运行。但是当我用计时器“等待”时,if 语句将再执行
基本上我有以下代码片段, (let [task (FutureTask. fn) thr (Thread. task)] (.start thr) ;;wait for signa
取消正在进行的 ASIHttpRequest 请求的正确位置在哪里?这就是我取消的方式,但是当我 时它继续崩溃在不让请求完成的情况下从一个 View Controller 转移到另一个 View Co
我在我的 winforms 应用程序中使用 BackgroundWorker 来执行另一个类中发生的长时间运行的任务(执行数据库操作)。由于所有工作都是在另一个类中完成的,因此取消并不那么简单。我在另
我正在使用 OneSignal 向我的用户显示通知。通知工作正常,但我注意到,如果我在通知栏中“滑动”取消通知,则通知将永远保留,这是一张显示应用程序图标上的通知的图像,我想在应用程序已打开: 我看到
正在运行的 AsyncTask 的 .cancel(boolean) 方法如何工作?这是文档: Attempts to cancel execution of this task. This atte
我注意到,当我激活约束时,我会立即在该行代码处收到一条警告,指出不能同时满足约束。 我假设布局是在“UI 更新周期”之类的稍后时间点计算的,而不是每次约束都被(取消)激活。因此,在(取消)激活约束的代
这是我创建线程的方式: readFromWebThread = [[NSThread alloc] initWithTarget:self selector:@selector(loadThread:
我目前正在尝试取消与我的数据模型中的对象关联的特定 UILocalNotifications。为此,每个数据对象都有一个唯一标识符,即 NSUUID。 创建 UILocalNotification:
当我提交并单击“确定”时,它会继续,但当我按“取消”时,它仍然会提交。我尝试使用此代码,但提交和取消按钮仍然执行相同的操作。 model.saveForm = function() { var
我有一个警报弹出窗口,当发生特定操作时会出现该弹出窗口。 5 秒后,使用 setTimeout() 隐藏警报弹出窗口。 我遇到的问题是,如果我多次触发弹出窗口,有时后续的弹出窗口会出现但立即消失。我相
我有一些 javascipt (jQuery),其中单击按钮时会淡入 #myDiv,然后使用超时函数在 5 秒后再次淡出。它工作正常,但如果用户在超时内的 fadeOut 函数运行之前再次单击该按钮,
我是一名优秀的程序员,十分优秀!