2

私はAppcodaのチュートリアルに従っています:http: //www.appcoda.com/background-transfer-service-ios7/ ですが、迅速に書いています。私は迅速に作業することができないこのコード行に出くわしました

-(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)() に割り当てる方法がわかりません。void(^completionHandler)() は迅速に認識されません。

これに関するヘルプをいただければ幸いです。

4

1 に答える 1

2

completionHandlerクロージャーの定義が置かれている場所であるため、おそらく app デリゲートに取り組む必要があります。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?()
于 2015-01-20T22:50:39.200 に答える