- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个应用程序可以借助 Background Fetch 在后台获取内容。
因此,如果发生后台提取,我的 application:performFetchWithCompletionHandler:
方法将被调用。在此方法中,我使用 NSURLConnection 来异步获取内容。
在我当前的实现中,我只启动请求,然后使用 UIBackgroundFetchResultNewData
调用 completionHandler
。我知道这是不对的。所以我的问题是,当异步请求在 connection:didReceiveData:
方法中完成时,我如何正确调用 completionHandler
。
最佳答案
你是对的——你应该只在抓取实际完成时调用完成处理程序。否则 iOS 可能会在连接完成之前让您的应用程序重新进入休眠状态,并且应用程序实际上不应该能够确定 UIBackgroundFetchResultNewData
与 UIBackgroundFetchResultNoData
或 UIBackgroundFetchResultFailed
无论如何直到那时。你怎么知道你的连接会成功?
您需要保留 completionHandler 并仅在连接完成后调用它。您很可能希望向您的委托(delegate)添加一个实例变量,将完成处理程序复制到那里,并在完成后调用它。
旁白:connection:didReceiveData:
不表示请求结束。根据文档:
Sent as a connection loads data incrementally.
[...]
The delegate should concatenate the contents of each data object delivered to build up the complete data for a URL load.
您可能会收到任意数量的调用,而 URL 连接的最终结果是所有调用的累积。
编辑:您通过创建正确类型的实例变量并将 block 复制到它来存储 block 。 block 具有不寻常的语义,因为与所有其他类型的 Objective-C 对象不同,它们最初是在堆栈上创建的。最终效果就是您总是复制
它们。如果您复制时它们在堆栈上,那么它们最终会在堆上。如果它们已经在堆上,那么副本只是作为保留,因为无论如何 block 总是不可变的。
所以:
@implementation XXMDYourClass
{
// syntax follow the C rule; read from the centre outwards
void (^_completionHandler)(UIBackgroundFetchResult);
}
- (id)initWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
self = [super init];
if(self)
{
// keep the block by copying it; release later if
// you're not using ARC
_completionHandler = [completionHandler copy];
}
return self;
}
- (void)somethingThatHappensMuchLater
{
_completionHandler(UIBackgroundFetchResultWhatever);
}
@end
关于ios - 何时在应用程序 :performFetchWithCompletionHandler: when Background Fetch is async? 中调用 completionHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19414317/
当我在 Debug模式下在 iPhone 模拟器中进行身份验证时,将运行下面代码中的第一个 if 语句。但是,当我在安装了 Evernote 客户端的 iPhone 上进行调试时,if 语句未被评估。
在我使用 URLSession.dataTask(with:completionHandler:) 创建新的 session 数据任务之后并通过调用其 resume() 来启动任务方法,鉴于应用程序在
我是今天扩展的新手,我收到了这个警告,有人知道如何匹配可选要求吗? Instance method 'widgetPerformUpdate(completionHandler:)' nearly m
我想了解 NSObject 可能属于哪个类(除 NSAlert、NSOpenPanel 和 NSSavePanel 之外),以便响应上述调用(如问题标题中所示)。这是我需要做的场景。菜单选择的操作必须
我在互联网上到处搜索,但无法真正处理我找到的答案。因此,如果有人可以在这里帮助我,我将不胜感激。 我写了一个看起来像这样的函数: func setImage(imageName: String, co
为什么我的完成处理程序出现问题,我该如何解决? func loadImageusingCacheWithUrlString(urlString: String) { self.image =
我试图将 bool 值传递给我的完成处理程序。当应用程序运行时,将 bool 传递给我的完成处理程序的结果决定了我显示的警报。如果我在错误检查中调用它,应用程序会崩溃/锁定。如果我在其他任何地方调用它
所以我试图让它在完成处理程序之后做一些事情,但我一直收到错误: expected CLGeocodeCompletionHandler class func didCompleteGeocoding(
我想为我的 completionHandler 默认参数传递: func firstFunc(completionHandler: ((array:[String:AnyObject] = [:])
我最近加入了一个新项目并开始研究 iOS 应用程序代码库。但是,在最新的 Xcode 10 中,代码不再编译。 protocol NetworkClientType { associatedtyp
以下代码是线程安全的吗?如果是这样,如何保证ByteBuffer 的安全发布?执行 CompletionHandler 的线程的实例? AsynchronousSocketChannel channe
This question already has answers here: Swift 3 URLSession.shared() Ambiguous reference to member 'd
在 Xcode 5.0.2 中设置要显示为模式表的 NSAlert 对象时,我遇到了一个有趣的惊喜。 我计划使用 beginSheetModalForWindow:modalDelegate:didE
我已经执行了代码,但收到completionHandler 错误 如果没有更多上下文,表达类型不明确 据我了解,这是由于completionHandler 不匹配造成的。如何为completionHa
我正在使用 AVAssetImageGenerator 从影片剪辑中获取图像,而无需先播放它。现在我有一个问题如何在处理程序的循环中设置变量?是否可以?我收到此错误消息,但不知道这意味着什么。 (谷歌
我已经执行了代码,但收到completionHandler 错误 如果没有更多上下文,表达类型不明确 据我了解,这是由于completionHandler 不匹配造成的。如何为completionHa
我试图在加载数据后加载我的 CollectionView,但我不知道应该如何使用 CompletionHandler 来执行此操作。感谢帮助我的代码如下:用于获取数据: func GETData(){
我正在尝试使用 openActiveSessionWithPublishPermissions 在 Facebook 上发布消息,因此如果用户未登录,他需要先登录,然后使用 io6 Facebook
我有以下方法,如果 SessionStatus 完成,我想返回 movieDestinationUrl,但是我不断收到此错误 Unexpected non-void return value in v
我有一个 UITextField,它允许用户为 Facebook 照片输入自定义相册名称。 textFieldShouldReturn 后,我将 textField.text 发送到 Facebook
我是一名优秀的程序员,十分优秀!