首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速复制completionHandler

快速复制completionHandler
EN

Stack Overflow用户
提问于 2015-01-20 22:39:12
回答 1查看 919关注 0票数 2

我一直在跟踪Appcoda的一个教程:http://www.appcoda.com/background-transfer-service-ios7/,但我使用的是快速编写它。我遇到了这一行代码,我无法快速地工作。

代码语言:javascript
复制
-(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];
                }];
            }
        }
    }];
}

我不能说对的地方是:

代码语言:javascript
复制
void(^completionHandler)() = appDelegate.backgroundTransferCompletionHandler

我有appDelegate.backgroundTransferCompletionHandler变量,但是我不知道如何将它赋值给void(^completionHandler)()。void(^completionHandler)()未被斯威夫特所识别。

在这方面的帮助将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-20 22:50:39

您可能应该处理应用程序委托,因为这是completionHandler闭包的定义所在。您可能会将backgroundTransferCompletionHandler属性定义为一个闭包,它是一个可选的,可能类似于:

代码语言:javascript
复制
var backgroundTransferCompletionHandler: (() -> ())?

func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) {
    backgroundTransferCompletionHandler = completionHandler

    // do whatever else you want (e.g. reinstantiate background session, etc.)
}

然后,您在问题中引用的代码的快速呈现将获取该completionHandler的本地副本,如下所示:

代码语言:javascript
复制
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate

let completionHandler = appDelegate.backgroundTransferCompletionHandler

然后称之为:

代码语言:javascript
复制
completionHandler?()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28056444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档