可以在这里使用一些帮助,因为我对块和完成处理程序的理解非常有限。
我正在尝试在iOS中实现后台提取,同时遵循本教程并根据需要更改内容:http://www.appcoda.com/ios7-background-fetch-programming/
我已经实现了必要的前驱来启用后台提取,并在我的viewController中实现了以下方法,并验证了在模拟后台提取时它被触发:
- (void)retrieveMessagesInBackgroundWithHandler:(void (^)(UIBackgroundFetchResult))completionHandler
在我的方法中,我正在调用一个类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类型说明符)
我真的不确定如何正确实现这一点,并希望获得一些见解。任何帮助将不胜感激。
提前致谢!!
答案 0 :(得分:1)
您不应该分配完成块,您应该执行它并传递参数:
completionHandler(UIBackgroundFetchResultNoData);
请注意,为了安全起见,您还应该检查completionHandler
是否为零,因为它会崩溃。