- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在使用 addOperationWithBlock
时遇到了一些奇怪的结果。
我的函数看起来像这样:
-(void) myFunction{
NSLog(@"VISITED");
..
for (NSDictionary *Obj in myObjects)
{
[operationQueue addOperationWithBlock:^(void){
MyObject* tmp = [self tediousFunction:Obj];
// threadTempObjects is member NSMutableArray
[self.threadTempObjects addObject:tmp];
NSLog(@"ADDED");
}];
}
[operationQueue addOperationWithBlock:^(void){
[self.myArray addObjectsFromArray:self.threadTempObjects];
for(myObject *myObj in self.myArray)
{
// MAIN_QUEUE
[[NSOperationQueue mainQueue] addOperationWithBlock:^(void) {
[self updateUI:myObj];
}];
}
}];
[operationQueue addOperationWithBlock:^(void){
[[NSOperationQueue mainQueue] addOperationWithBlock:^(void) {
[self filterResults];
}];
}];
}
我的字典包含 4 个值,因此 ADDED 在日志中显示 4 次。但是,当我查看 filterResults 内部时,我发现 myArray 中只有 2 个对象。意思是4次调用operationQueue并没有在调用filterResults操作之前结束(虽然是后来加的!)
我认为 operationQueue 是串行的,我可以指望它,当我添加一个操作时,它会在最后一个操作之后立即添加。所以奇怪的是,在之后的数组中只有 2 个操作。我错过了什么?谢谢
最佳答案
从您共享的初始化代码中我们可以了解到 operationQueue
不是串行的,这意味着它将执行操作,并分配线程直到系统设置最大线程数(与 GCD 相同) .
这意味着添加到 operationQueue
的操作是并行运行的。
要连续运行它们,请将 maxConcurrentOperationCount
设置为 1。
尝试类似的东西:
__block __weak id weakSelf = self;
[operationQueue setMaxConcurrentOperationCount:1];
for (NSDictionary *Obj in myObjects)
{
[operationQueue addOperationWithBlock:^{
MyObject* tmp = [weakSelf tediousFunction:Obj];
// threadTempObjects is member NSMutableArray
[weakSelf.threadTempObjects addObject:tmp];
NSLog(@"ADDED");
}];
}
[operationQueue addOperationWithBlock:^{
[weakSelf.myArray addObjectsFromArray:weakSelf.threadTempObjects];
for(myObject *myObj in weakSelf.myArray)
{
// MAIN_QUEUE
[[NSOperationQueue mainQueue] addOperationWithBlock:^(void) {
[weakSelf updateUI:myObj];
}];
[[NSOperationQueue mainQueue] addOperationWithBlock:^(void) {
[weakSelf filterResults];
}];
}
}];
但是,这等同于(甚至效率更低):
__block __weak id weakSelf = self;
[operationQueue addOperationWithBlock:^{
for (NSDictionary *Obj in myObjects) {
MyObject* tmp = [weakSelf tediousFunction:Obj];
// threadTempObjects is member NSMutableArray
[[NSOperationQueue mainQueue] addOperationWithBlock:^(void) {
[weakSelf updateUI:tmp];
}];
[weakSelf.myArray addObject:tmp];
NSLog(@"ADDED");
}
[[NSOperationQueue mainQueue] addOperationWithBlock:^(void) {
[weakSelf filterResults];
}];
}];
关于ios - addOperationWithBlock 的操作顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15884690/
我在使用 addOperationWithBlock 时遇到了一些奇怪的结果。 我的函数看起来像这样: -(void) myFunction{ NSLog(@"VISITED"); ..
我有一个基本问题,关于NSOperationQueue addOperationsWithBlock 中的操作顺序。 我想做的事情: [_queue addOperationWithBlock:^{
我正在使用 NSOperationQueue 的 addOperationWithBlock。在 block 内,我如何检查我是否应该取消操作?或者访问任何 NSOperation 属性/方法? [m
这个问题在这里已经有了答案: Memory leak with "libBacktraceRecording.dylib" in React Native ios application (1 个
NSDate *dateStartAutoComplete = [NSDate date]; [[NSOperationQueue new]addOperationWithBlock:^{ N
事情是这样的,我得到了一些不执行的代码(编译器运行代码但不做任何事情)...这是代码...使用 NSURLSessionDelegate 和 [NSOperationQueue mainQueue]
我有一个包含 3 个步骤的流程。每一个都需要在另一个之前完成(同步、串行等)。所有这些都需要在后台完成,以免阻塞 UI。 我正在尝试重新设计一些东西以使用 2 个队列,一个用于网络操作,一个用于数据库
我读过很多文章都说“积木是 future !!!”。我想知道它是否与后台运行操作有关。 例如,我有一个表格 View ,其中包含来自网络的图像。现在我可以使用 +[NSOperationQueue a
我是一名优秀的程序员,十分优秀!