问题标签 [completionhandler]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1063 浏览

java - AsynchronousByteChannel 的线程含义

AsynchronousByteChannel.read()的 Javadoc说操作是异步进行的,但是当到达流的末尾时会发生什么?是否允许在调用 read() 的同一线程中触发完成处理程序?从实现的角度来看,没有理由异步执行此操作,因为我们已经知道结果。类似地,如果用户尝试读取剩余()返回 0 的 ByteBuffer,我们知道读取操作必须返回 0。

我问是因为我在自己的 AsynchronousByteChannel 实现中遇到了竞争条件。我正在调用一个完成处理程序,该处理程序在操作完成时对其自身调用 notify()。然后我调用以下用户代码:

请注意,用户假设操作完成时将通知处理程序,但由于 read() 实际上同步调用完成处理程序,它在 wait() 之前得到通知,后者将永远阻塞。

规范是否要求我在单独的线程中更新 CompletionHandler,或者用户是否应该知道调用 read() 的线程可能会同步执行某些操作?

0 投票
3 回答
7092 浏览

ios - NSURL 连接 sendAsynchronousRequest 如何保存响应?

我有以下方法:

现在,我试图从块/处理程序返回一个值,但显然这是不可能的(或者我还没有弄清楚语法)。

我试图设置一个局部变量来获取回复(数据)的值,但它会产生错误。

不产生错误的唯一方法是使用类属性。但是当我尝试读取 [self reply] 的值时,它是 null,这让我认为它永远不会被设置。

我知道sendAsync函数是线程和异步的,所以[self reply]的值为null的原因是,当我使用sendSynchronousRequest时,我总是得到回复???

我在做什么错,如何从 completionHandler 中返回一个值???

编辑#1:在我看来,我做错了什么。我正在跟踪代码,当我使用同步发送时,一切正常。使用异步的,对 sendAsynchronousRequest 的实际调用从未执行过,这让我认为线程没有被调用,因此是空值。

编辑#2:我通过添加以下内容找到了解决此问题的方法:

但是,我不完全确定我理解它是如何工作的。我想 RunLoop 告诉异步操作运行 2 秒(我可以验证,因为将日期间隔设置为低值时,由于使用实时服务器进行测试,我得到一个空响应)。我不明白的是,当我只是告诉 RunLoop 运行时,它会永远阻塞一切,就好像当前线程从未终止一样。

0 投票
1 回答
3016 浏览

java - 如何使用 CompletionHandlers 和小于请求的 ByteBuffer 读取请求?

我正在使用 Java 7 和AsynchronousSocketChannel. 我想阅读一个请求(例如HTTP POST),但我正在努力想出一个很好的解决方案来阅读完整的请求,如果它大于ByteBuffer我正在使用的大小。例如,如果ByteBuffer是 4048 字节并且 HTTP POST 包含大于 4kB 的图像。

有什么好的递归解决方案或循环吗?

这是我的阅读请求代码:

我写的地方:

它看起来是代码重用的好地方,但我想不出一个好的解决方案。有什么办法可以在这里重用 CompletionHandler 吗?有什么建议可以阅读有限的完整请求ByteBuffer吗?

我想以非阻塞和异步的方式解决这个问题。

0 投票
1 回答
14118 浏览

ios - 使用 reverseGeocodeLocation: 设置地址字符串并从方法返回

我正在尝试将起点和终点本地化为地址字符串,以便可以将其存储到NSUserDefaults. 问题是该方法继续执行并且没有设置我的变量。

这是我的应用程序调试器显示的内容:

开始
_

例如,如果我的地址是:“Mainstreet 32​​, CITY”。那么我想看到的是以下内容:

开始
Mainstreet 32​​, CITY
Einde

问题是我的代码没有等待我CLGeocoder完成,所以我的变量returnAddress在返回时没有设置,它是空的。

有谁知道如何解决这个问题?

0 投票
1 回答
182 浏览

ios - CLGeocoder 延迟直到完成处理程序

我有一个应用程序需要从字符串到纬度/经度值进行地理编码,我使用 iOS 类参考中的地理编码器:

http://developer.apple.com/library/ios/#documentation/CoreLocation/Reference/CLGeocoder_class/Reference/Reference.html#//apple_ref/occ/cl/CLGeocoder

但是完成处理程序在我需要它之后被调用(即我有使用这些纬度/经度值的代码,但在它们可用之前被调用)

有什么想法吗?

0 投票
1 回答
179 浏览

ios - 好像我的应用程序以错误的顺序做事

(注意:你甚至可以在不阅读我的任何代码的情况下回答这个问题,如果你不想阅读这个问题小说,我已经在底部解释过)

我有一些代码让我有些偏离了方向。似乎我的代码[tableView reloadData]在数据准备好之前就在调用,尽管我在调用之前设置了数据reloadData。这可能是一个新手问题,但我以前从未处理过这种代码,如果有人能向我解释到底发生了什么,我会很高兴,以及为什么允许我的一些代码跳出时间逻辑的..

我的问题与GameCenter无关,我认为这是一个通用的Objective-C东西,但我正在使用GameCenter来体验它,所以即使你对GameCenter一无所知,你也可能能够理解我的意思正在谈论。

我有一个 tableViewController,我正在用 GameCenter 中的比赛(游戏)填充 tableView,并显示对手的名字(在我的回合制游戏中总是一个对手)。

我把这个放在我的viewDidAppear

这是我的CellForRowAtIndexPath

问题是:当视图控制器出现时:正如预期的那样,tableView 最初是空的,但大约半秒后,它会在正确的游戏数量中填充“Game vs.Nobody”。如果我开始两个游戏,然后重新进入视图控制器,那么它一开始是空白的,然后在两个单元格上显示“Game vs.Nobody”。但是:如果我滚动屏幕外的行,并强制他们cellForRowAtIndexPath再次调用,则会显示正确的名称。所以似乎[tableView reloadData]viewDidAppear我要求它之前调用了 in ,在填充了名称的数组之前。

我认为这与整个 CompletionHandler 相关,因为我以前从未使用过它,但我认为 CompletionHandler 中的所有内容都应该按时间顺序发生?有什么我可以打电话的,比如onCompletion{}什么?

理想情况下,我希望 UIAlertView 或带有旋转轮显示的东西UIActivityIndicationView,我希望它显示,直到所有数据都已正确加载。我不知道如何找出完成处理程序何时完成,以及它到底是什么..

0 投票
3 回答
227 浏览

ios - 在 iPhone 中,我如何知道在使用前向地理编码时我的所有地图注释何时已加载?

在我的应用程序中,我有一个表格视图,可以切换地图视图上的注释。我可以通过标签栏控制器在表格视图和地图视图之间来回切换。我的地图将重新加载视图上的注释(来自表格视图中的选定项目)确实出现了。我需要知道这些注释何时完成加载,以便我可以运行我的方法来缩放到由注释集群确定的生成区域。

问题是当我在视图中的 addAnnotations 方法确实出现之后直接运行缩放方法时,它会在我的注释获得正确的坐标之前开始缩放过程。从而导致不正确的缩放,并且我的注释移动到正确的位置。

我还想指出,我正在使用前向地理编码来获取我的注释坐标。

这是我的观点确实出现了:

这是我的缩放方法:

感谢您的帮助,谢谢。抱歉,如果这是草率,这是我的第一篇文章。

编辑:
这是我根据 nevan king 的回答编辑的地理编码器方法。

也不是我尝试使用注释数组的计数来确定最后一个注释的地理编码完成处理程序以仅更改该特定区域的区域。但这对我所在的地区产生了不一致的结果。这是它始终将所有注释保持在视图中的唯一方法。

0 投票
3 回答
35411 浏览

objective-c-blocks - 使用 reloadData 方法重新加载 UICollectionView 会在重新加载数据之前立即返回

我需要知道何时重新加载 UICollectionView 以在之后配置单元格(因为我不是单元格的数据源 - 否则已经完成了......)

我试过代码,比如

我也尝试过使用

但是当我重新加载数据时,我会崩溃。

如何将数据重新加载到集合中,并且仅在完成重新加载后 - 执行特定的完成处理程序

0 投票
1 回答
31695 浏览

ios - 完成处理程序如何在 iOS 上工作?

我试图了解完成处理程序和块。我相信你可以在没有完成处理程序的情况下将块用于许多深度编程,但我想我理解完成处理程序是基于块的。(所以基本上完​​成处理程序需要块,但不是相反)。

所以我在网上看到了这段关于旧推特框架的代码:

在这里,我们调用了一个方法,该方法执行操作(执行 TWRequest)并在完成 responseData & urlResponse & error 时返回。只有当它返回时,它才会执行测试授予的块并停止活动指示器。完美的!

现在这是我为另一个可以工作的应用程序设置的设置,但我正在尝试将这些部分组合在一起:

以下是我的理解:

  1. fetchUsersWithCompletionHandler 显然是 performRequestWithHandler 的同系物
  2. 不幸的是,这有点复杂,因为途中有一个 GCD 调用......

但基本上,执行请求并处理错误,处理数据,然后检查处理程序。我的问题是,这个处理程序部分是如何工作的?我知道如果它存在,那么它将发送回主队列并返回 usersArray。但是它怎么知道要等到 usersArray 被填充?我想让我感到困惑的是,在这种情况下,method:block 内部还有另一个块,即 dispatch_async 调用。我想我正在寻找的是真正做事情的逻辑,并且知道何时返回 responseData 和 urlResponse。我知道它不是同一个应用程序,但我看不到 performRequestWithHandler 的代码。

0 投票
1 回答
1390 浏览

java - ForkJoinTask 完成处理程序

我有一个长期运行的计算,我已经与Java 的ForkJoinTask.

JavaFutureTask提供了一个模板方法done()覆盖此方法允许“注册完成处理程序”

是否可以为 a 注册完成处理程序ForkJoinTask

我问是因为我不想在我的应用程序中有阻塞线程 - 但是一旦我通过调用result = ForkJoinPool.invoke(myForkJoinTask)or检索计算结果,我的应用程序就会有一个阻塞线程result = ForkJoinPool.submit(myForkJoinTask).get()