- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用带有 Core Data 的远程数据库,当我执行以下提取请求时,根据互联网连接,可能需要一些时间。我想监控这两个请求,当它们完成时——无论是成功还是失败——我想触发另一种方法。
获取请求 1:
[self.managedObjectContext executeFetchRequest:fetchRequest1 onSuccess:^(NSArray *results) {
//Succcess
[self.refreshControl endRefreshing];
} onFailure:^(NSError *error) {
[self.refreshControl endRefreshing];
}];
获取请求 2:
[self.managedObjectContext executeFetchRequest:fetchRequest2 onSuccess:^(NSArray *results) {
//Succcess
[self.refreshControl endRefreshing];
} onFailure:^(NSError *error) {
[self.refreshControl endRefreshing];
}];
我想等到提取请求 1 和 2 都完成后再调用另一个方法。
我可以使用 NSOperationQueue
来监控这两个 block 吗?如果没有,知道两个区 block 何时完成的最佳方法是什么?
最佳答案
当你有带有依赖的异步任务时,你有几个选择:
代码更改最少的最简单解决方案是使用信号量:
// create a semaphore
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
// initiate two requests (signaling when done)
[self.managedObjectContext executeFetchRequest:fetchRequest1 onSuccess:^(NSArray *results) {
[self.refreshControl endRefreshing];
dispatch_semaphore_signal(semaphore);
} onFailure:^(NSError *error) {
[self.refreshControl endRefreshing];
dispatch_semaphore_signal(semaphore);
}];
[self.managedObjectContext executeFetchRequest:fetchRequest2 onSuccess:^(NSArray *results) {
[self.refreshControl endRefreshing];
dispatch_semaphore_signal(semaphore);
} onFailure:^(NSError *error) {
[self.refreshControl endRefreshing];
dispatch_semaphore_signal(semaphore);
}];
// now create task to to wait for these two to finish signal the semaphore
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// wait for the two signals from the two fetches to be sent
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
// now do whatever you want when those two requests finish
// if you need to do any UI update or do any synchronizing with the main queue, just dispatch this to the main queue
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"all done");
});
});
这种方法可能是最简单的方法,但会带来各种限制。例如,这将占用一个等待其他两个线程发送信号的工作线程,因此您必须确信您不会同时处理太多这些请求集合。您还必须确信这些请求将调用 onSuccess
或 onFailure
,但永远不会同时调用两者。这也并没有真正提供取消机会或自己限制并发程度的能力。但您可以通过最少的代码更改来完成上述操作。
第二种方法是将异步请求替换为同步请求,然后您可以使用 NSOperation
标准 addDependency
逻辑:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
// completion operation
}];
NSOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
// do fetch1 _synchronously_
}];
[queue addOperation:operation1];
NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
// do fetch2 _synchronously_
}];
[queue addOperation:operation2];
[completionOperation addDependencies:@[operation1, operation2]];
[queue addOperation:completionOperation];
此方法要求您的同步提取是线程安全的。我不熟悉您正在使用的这个 API,所以我不能说。
如果您没有可以添加到队列中的获取请求的同步再现,第三种方法是使用您自己的并发 NSOperation
子类包装您的异步获取请求在异步操作完成之前不会发出 isFinished
信号(并且可能会调用您自己的 onSuccess
和 onFailure
block )。一旦你这样做了,你就可以使用 setDependency
功能(如前一点所示)使你的第三个操作依赖于其他两个完成。有关详细信息,请参阅 Configuring Operations for Concurrent Execution 并发编程指南部分。
我希望我能提供更明确的答案,但我对并发托管上下文库所包含的选项/约束还不够熟悉。
关于ios - 当两个单独的 NSFetchRequests 都完成时采取行动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19919771/
我的类有一个 foo 方法和一个 main 方法,其中有一些变量和一个 print 语句。 public static boolean foo(int x, boolean b) { if (
我正在尝试对每几列取行平均值。这是一个示例数据集。 d = {'2000-01': range(0,10), '2000-02': range(10,20), '2000-03': range(10,
在 Nsight Visual Studio 中,我们将有一个图表来呈现“已采取”、“未采取”和“分歧”分支的统计信息。我对“不采取”和“分歧”之间的区别感到困惑。例如 kernel() { if
在 Nsight Visual Studio 中,我们将有一个图表来呈现“已采取”、“未采取”和“分歧”分支的统计信息。我对“不采取”和“分歧”之间的区别感到困惑。例如 kernel() { if
int main() { long int i,t,n,q[500],d[500],s[500],res[500]={0},j,h; scanf("%ld",&t); whil
我在 Linux 上使用 racket v6.5 repl 并尝试运行流教程中的 take 函数示例 https://docs.racket-lang.org/functional-data-stru
tl;博士无法在 ggpairs 中获得独立的图例(描述整个情节的常用颜色)令我满意。 对不起,长度。 我正在尝试使用 GGally::ggpairs 绘制(下三角形)对图(用于绘制各种绘图矩阵的扩展
几个月前我问过this question 。我想添加一个具有不同背景的相同 div。我想知道为什么 jQuery 在第二个 div 中不起作用?我发现仅当我单击第二个 div 中的小图像时,图像才会在
引用Performing a right join in django ,当我尝试类似的方法时(字段略有不同): class Student: user = ForeignKey(User)
所以我使用带有 Action Sheet 样式的 UIAlertController 来显示两个选项,一个用于取消操作,另一个用于删除数据。按钮工作正常,删除按钮工作,操作表关闭。我的问题是,在后台从
我有一个列表,其中每个单元格都是一个可放置的对象,可以接受某个类的可拖动对象。该表的边框是可见的,但我不希望固定大小的单元格着色且可见,这对我来说很难看。当我拖动一个可拖动对象与一个单元格相交时,该单
我有一个 RDD,它是通过读取一个大小约为 117MB 的本地文本文件形成的。 scala> rdd res87: org.apache.spark.rdd.RDD[String] = MapPart
如果我们有 n 级台阶并且我们可以一次上 1 或 2 级台阶,则台阶数和攀登台阶的方式之间存在斐波那契关系。当且仅当我们不认为 2+1 和 1+2 不同。 但是,情况不再如此,我们还必须添加第三个选项
var query = from ch in Client.wcf.context.CashHeading where ch.Id_customer == customern//cc.Id
我是一名优秀的程序员,十分优秀!