- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 NSOperations 拆分我的程序流。我正在使用 Parse 框架制作一个简单的消息传递应用程序。我想显示一些消息,然后删除它们。除非删除操作完成,否则不应调用显示消息,因此我想尝试使用 NSQueue 并向其添加 displayMessages 操作,然后添加 deleteMessages 操作(下面名为 MyOperation)。我知道并发操作意味着它们只会以队列方式一个接一个地执行。下面是我的删除方法代码。有没有办法手动告诉操作已完成,即设置 isFinished 或 isExecuting??
// MyOperation.h
@interface MyOperation : NSOperation {
@property (strong, nonatomic) NSMutableArray *toDelete;
}
@end
And the implementation:
// MyOperation.m
@implementation MyOperation
- (id)initWithArray:(NSMutableArray *)array
{
self = [super init];
if (self == nil)
return nil;
_toDelete=array;
}
- (void)main {
if ([self isCancelled]) {
NSLog(@"** operation cancelled **");
}
//how do I get main to finish execution ONLY after deleteAllInBackground has finished?
[PFObject deleteAllInBackground:self.toDelete];
if ([self isCancelled]) {
NSLog(@"** operation cancelled **");
}
NSLog(@"Operation finished");
}
@end
现在上面这段代码不能解决我的问题。它会将操作排队,但即使 deleteAllInBackground 仍在运行,这个操作也会完成。真的很感谢这里的帮助!谢谢
其他可能的解决方案:
-(void)receivedMessage
{
NSLog(@"push!");
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
[self displayMessages];
dispatch_async(dispatch_get_main_queue(), ^(void){
if([self.toDelete count]>0) {
[PFObject deleteAllInBackground:self.toDelete];
}
});
});
}
最佳答案
我建议你像下面这样使用dispatch_async
;
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
dispatch_async(dispatch_get_main_queue(), ^(void){
// Display messages
});
// Delete messages here
});
如果您必须使用NSOperationQueue
,那么我建议您使用KVO
来获取任务完成的通知;设置队列时,请执行以下操作:
[self.deleteQueue addObserver:self forKeyPath:@"delete-operations" options:0 context:NULL];
然后在您的 observeValueForKeyPath
中执行此操作:
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
if (object == self.deleteQueue && [keyPath isEqualToString:@"delete-operations"]) {
if ([self.queue.operations count] == 0) {
// Delete operation done
// Display messages here
}
} else {
[super observeValueForKeyPath:keyPath ofObject:object
change:change context:context];
}
}
[编辑]
-(void)receivedMessage {
@synchronized(self) {
NSLog(@"push!");
dispatch_async(dispatch_get_main_queue(), ^(void) {
[self displayMessages];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
if([self.toDelete count]>0) {
// this deletion doesn't matter if background or on main thread as it's already in background queue
[PFObject deleteAllInBackground:self.toDelete];
}
});
});
}
}
关于ios - Concurrent NSOperation 以及如何设置 isFinished 和 isExecuting?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28154011/
我试图弄清楚 IOs 如何管理线程:即使文档不建议同时使用 p_thread POSIX 和 NSThread(在 swift 中只是线程),我认为了解它们的工作方式很有帮助。我试图用 Thread
我订阅了一个命令的 IsExecuting: LoginCommand.IsExecuting.Subscribe(x => Log("Logging in")); 当我的 Command 被 Inv
我从一个冷的可观察对象创建了一个 react 命令。调用命令时,它会将 IsExecuting 更改为 true,并将 first emitted value 从 observable 更改回 fal
我在 Swift 中对 NSOperation 进行子类化,并且需要覆盖 isExecuting 和 isFinished 属性,因为我正在覆盖 start 方法。 我遇到的问题是如何在保留键值观察
我想知道绑定(bind)到 ReactiveCommand 的 IsExecuting 的推荐方式. 问题是初始命令执行(在构造函数末尾开始)没有使用 IsLoading 更新 WPF 控件。作为绑定
来自样本here ,我正在尝试将 _SpinnerVisibility 更改为多个 reactivecommand 对象。所以下面的片段显示了我所做的.. public ReactiveCommand
到目前为止,我已经实现了一个可以创建 HMActionSet 的应用程序,它们被添加到 HomeKit 中,它们也可以被执行(附件模拟器中的值相应地改变)。但是,我遇到了一个奇怪的问题:每当我调用 f
我正在使用 java.nio.file.Files 类来检查登录用户是否有权执行文件。虽然我有权执行文件(即我可以手动运行该文件),但 isExecutable(pathToFile) 返回 fals
我正在尝试使用 NSOperations 拆分我的程序流。我正在使用 Parse 框架制作一个简单的消息传递应用程序。我想显示一些消息,然后删除它们。除非删除操作完成,否则不应调用显示消息,因此我想尝
我试图允许将 .exe 单元测试文件拖放到 QMainWindow 中。我的 dragEnterEvent 看起来像这样: void MainWindow::dragEnterEvent(QDragE
我的 ViewModel 中有几个命令,我希望将每个按钮的 CanExecute 绑定(bind)到一个可观察到的繁忙状态,该状态被定义为当前没有任何按钮正在执行。 以下是我想出的,但显然它遇到了 N
我目前正在使用 C++ 和 Qt 开发应用程序,我需要知道输入文件是否可执行。 我正在使用 QFileInfo::isExecutable(),它对大多数文件都能正常运行,除了那些具有 .msi 扩展
我是 ReactiveUI 的新手,正在按照 here 中的示例进行操作,以及我进行的单元测试。 正如预期的那样,示例代码完美运行,但我的单元测试断言当我的 ReactiveCommand _spin
我正在使用 UITableView显示分页列表,我正在使用 UIRefreshControl表示正在发生网络请求。 然而,出于某种原因self.refreshControl.beginRefreshi
我是一名优秀的程序员,十分优秀!