iOS:块内的 UIBackgroundFetchResult 完成处理程序
iOS: UIBackgroundFetchResult completion handler inside of block
因为我对块和完成处理程序的理解非常有限,所以在这里需要一点帮助。
我正在尝试在 iOS 中实现后台抓取,同时遵循本教程并根据需要进行更改:http://www.appcoda.com/ios7-background-fetch-programming/
我已经实现了启用后台获取所需的先决条件,并在我的 viewController 中实现了以下方法,并验证了它在模拟后台获取时被触发:
- (void)retrieveMessagesInBackgroundWithHandler:(void (^)(UIBackgroundFetchResult))completionHandler
在我的方法中,我正在调用 class SoapRequest 来执行对 Web 服务的异步调用,并且我能够确定我是否有新数据的完成处理程序。最后,我想发回 UIBackgroundFetchResult 值:
SoapRequest *sr = [SoapRequest createWithURL:[NSURL URLWithString:kServiceURL] soapAction:soapAction postData:soapEnvelope deserializeTo:[NSMutableArray array] completionBlock:^(BOOL succeeded, id output, SoapFault *fault, NSError *error) {
if( !succeeded ) {
NSLog(@"method failed: %@", methodName);
completionHandler = (UIBackgroundFetchResultFailed);
} else {
//NSLog(@">>>>>> OUTPUT: %@", output);
NSDictionary *responseDictionary = output;
id response = responseDictionary[@"RetrieveMessagesResponse"][@"RetrieveMessagesResult"][@"a:MessagesResult"][@"b:MessageLabel"];
if ([response isKindOfClass:[NSArray class]]) {
NSArray *array = response;
completionHandler = (UIBackgroundFetchResultNewData);
} else {
NSLog(@"Nothing new");
completionHandler = (UIBackgroundFetchResultNoData);
}
}
}];
正如您想象的那样,我的问题是我试图在块内设置 completionHandler。我收到错误:
变量不可赋值(缺少 __block 类型说明符)
我真的不确定如何正确实施它,并希望获得一些见解。任何帮助将不胜感激。
提前致谢!!
你不应该分配完成块,你应该执行它并传递一个参数:
completionHandler(UIBackgroundFetchResultNoData);
请注意,为了安全起见,您还应该检查 completionHandler
是否为 nil,因为如果为 nil 则会崩溃。
因为我对块和完成处理程序的理解非常有限,所以在这里需要一点帮助。
我正在尝试在 iOS 中实现后台抓取,同时遵循本教程并根据需要进行更改:http://www.appcoda.com/ios7-background-fetch-programming/
我已经实现了启用后台获取所需的先决条件,并在我的 viewController 中实现了以下方法,并验证了它在模拟后台获取时被触发:
- (void)retrieveMessagesInBackgroundWithHandler:(void (^)(UIBackgroundFetchResult))completionHandler
在我的方法中,我正在调用 class SoapRequest 来执行对 Web 服务的异步调用,并且我能够确定我是否有新数据的完成处理程序。最后,我想发回 UIBackgroundFetchResult 值:
SoapRequest *sr = [SoapRequest createWithURL:[NSURL URLWithString:kServiceURL] soapAction:soapAction postData:soapEnvelope deserializeTo:[NSMutableArray array] completionBlock:^(BOOL succeeded, id output, SoapFault *fault, NSError *error) {
if( !succeeded ) {
NSLog(@"method failed: %@", methodName);
completionHandler = (UIBackgroundFetchResultFailed);
} else {
//NSLog(@">>>>>> OUTPUT: %@", output);
NSDictionary *responseDictionary = output;
id response = responseDictionary[@"RetrieveMessagesResponse"][@"RetrieveMessagesResult"][@"a:MessagesResult"][@"b:MessageLabel"];
if ([response isKindOfClass:[NSArray class]]) {
NSArray *array = response;
completionHandler = (UIBackgroundFetchResultNewData);
} else {
NSLog(@"Nothing new");
completionHandler = (UIBackgroundFetchResultNoData);
}
}
}];
正如您想象的那样,我的问题是我试图在块内设置 completionHandler。我收到错误: 变量不可赋值(缺少 __block 类型说明符)
我真的不确定如何正确实施它,并希望获得一些见解。任何帮助将不胜感激。
提前致谢!!
你不应该分配完成块,你应该执行它并传递一个参数:
completionHandler(UIBackgroundFetchResultNoData);
请注意,为了安全起见,您还应该检查 completionHandler
是否为 nil,因为如果为 nil 则会崩溃。