Swift - 复制完成处理程序
Swift - Copy completionHandler
我一直在关注 Appcoda 的教程:http://www.appcoda.com/background-transfer-service-ios7/
但写在 swift 中。我遇到了无法在 swift
中工作的这行代码
-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
// Check if all download tasks have been finished.
[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
if ([downloadTasks count] == 0) {
if (appDelegate.backgroundTransferCompletionHandler != nil) {
// Copy locally the completion handler.
void(^completionHandler)() = appDelegate.backgroundTransferCompletionHandler;
// Make nil the backgroundTransferCompletionHandler.
appDelegate.backgroundTransferCompletionHandler = nil;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// Call the completion handler to tell the system that there are no other background transfers.
completionHandler();
// Show a local notification when all downloads are over.
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.alertBody = @"All files have been downloaded!";
[[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
}];
}
}
}];
}
我不对的部分是:
void(^completionHandler)() = appDelegate.backgroundTransferCompletionHandler
我有 appDelegate.backgroundTransferCompletionHandler 变量,但我不知道如何将它分配给 void(^completionHandler)()。
swift.
无法识别 void(^completionHandler)()
我们将不胜感激。
您可能应该处理应用程序委托,因为那是 completionHandler
闭包的定义所在。您可能会将 backgroundTransferCompletionHandler
属性 定义为可选的闭包,可能类似于:
var backgroundTransferCompletionHandler: (() -> ())?
func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) {
backgroundTransferCompletionHandler = completionHandler
// do whatever else you want (e.g. reinstantiate background session, etc.)
}
然后,您在问题中引用的代码的 Swift 再现将获取该 completionHandler
的本地副本,如下所示:
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let completionHandler = appDelegate.backgroundTransferCompletionHandler
然后调用它:
completionHandler?()
我一直在关注 Appcoda 的教程:http://www.appcoda.com/background-transfer-service-ios7/ 但写在 swift 中。我遇到了无法在 swift
中工作的这行代码-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
// Check if all download tasks have been finished.
[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
if ([downloadTasks count] == 0) {
if (appDelegate.backgroundTransferCompletionHandler != nil) {
// Copy locally the completion handler.
void(^completionHandler)() = appDelegate.backgroundTransferCompletionHandler;
// Make nil the backgroundTransferCompletionHandler.
appDelegate.backgroundTransferCompletionHandler = nil;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// Call the completion handler to tell the system that there are no other background transfers.
completionHandler();
// Show a local notification when all downloads are over.
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.alertBody = @"All files have been downloaded!";
[[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
}];
}
}
}];
}
我不对的部分是:
void(^completionHandler)() = appDelegate.backgroundTransferCompletionHandler
我有 appDelegate.backgroundTransferCompletionHandler 变量,但我不知道如何将它分配给 void(^completionHandler)()。 swift.
无法识别 void(^completionHandler)()我们将不胜感激。
您可能应该处理应用程序委托,因为那是 completionHandler
闭包的定义所在。您可能会将 backgroundTransferCompletionHandler
属性 定义为可选的闭包,可能类似于:
var backgroundTransferCompletionHandler: (() -> ())?
func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) {
backgroundTransferCompletionHandler = completionHandler
// do whatever else you want (e.g. reinstantiate background session, etc.)
}
然后,您在问题中引用的代码的 Swift 再现将获取该 completionHandler
的本地副本,如下所示:
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let completionHandler = appDelegate.backgroundTransferCompletionHandler
然后调用它:
completionHandler?()