- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个异步方法 longRunningMethodOnObject:completion:
此方法接收“对象”类型的对象 - 使用其数据,然后调用完成处理程序。
我需要调用许多不同的“longRunningMethods”并等待全部完成。
我希望所有“longRunningMethodOnObject”在“for”循环中彼此异步(并行)运行。 (我不确定“longRunningMethodOnObject”是否彼此串行运行,但这是一个更普遍的问题)
我不确定我是否创建了正确的信号量,希望能解释一下在它们之间同步的正确方法。
包装函数的代码如下:
-(void)applyLongRunningOperationOnObjectInArray:(NSArray *)theObjects completion:(completion)block
{
// offsetting to worker thread in my object
dispatch_async(self.myQueue,^{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); //Not sure if this should be here or in the for loop
for(Object *ob in theObjects)
{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); // the semaphore for the "for" loop - should this be here? or above the for loop
[GlobalObject longRunningMethodOnObject:ob completion:^{ // would like each call to be independant of previous call in for loop
dispatch_semaphore_signal(semaphore); // signaling that it completed
}];
}
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // would like to wait here for each semaphore
block(); // invoke the completion handler
});
}
最佳答案
我想你可以在这种情况下使用 dispatch_semaphore
,但是调度组可能会使应用程序逻辑更简单:
NSArray *theObjects = @[@"Apple",@"Orange",@"Peach"];
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t _myQueue = dispatch_queue_create("com.cocoafactory.DispatchGroupExample",
0);
for( id ob in theObjects ) {
dispatch_group_async(group, _myQueue, ^{
// do some long running task.
});
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
// now do whatever should be done after
// all of your objects are processed
// in your case block()
Concurrency Programming Guide作为关于这个话题的一点。向下滚动到“等待队列任务组”
要回答有关任务是否在队列中同时执行的问题,这取决于。在上面的例子中,_myQueue
是一个串行队列。全局命名队列是并发的。从 iOS 5 开始,您还可以使用 DISPATCH_QUEUE_CONCURRENT
队列类型创建并发队列。
关于objective-c - 等待 dispatch_semaphore 以等待许多异步任务完成的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19464356/
有一些 Action 我想在不同的队列中做,所以我使用信号量。但是我用仪器检查它时有泄漏。该框架是 dispatch_semaphore_create。我用的是ARC,之前检查的时候没有漏水。代码如下
我有一个异步方法 longRunningMethodOnObject:completion: 此方法接收“对象”类型的对象 - 使用其数据,然后调用完成处理程序。 我需要调用许多不同的“longRun
当我想在 dispatch_after block 中执行代码时遇到问题。 首先,我在按下按钮时调用 UIActivityIndicator 以便在屏幕上显示它,并且在 uiactivityind
我有一个下载一些数据的 NSURLSession(带有委托(delegate))。我不希望启动下载 (refresh) 的方法在执行委托(delegate)方法之前返回。为此,我在 refresh 的
他们都使用了计数器,并使用锁来保护计数器的自增和自减,当计数器小于零时,线程等待。在我看来,除了它们的 api 之外,它们是相同的。 最佳答案 Apple 在他们的文档中写到关于 DispatchSe
我是一名优秀的程序员,十分优秀!