从类中调用父方法

Posted

技术标签:

【中文标题】从类中调用父方法【英文标题】:Calling parent method from a class 【发布时间】:2016-02-09 13:05:21 【问题描述】:

我是 Swift 和 ios 开发的新手,所以请原谅我使用的任何/所有陈述和术语...

我正在创建一个新的 Downloader 对象(仅用于下载 PDF 文件),我需要在 ViewController 中调用一个方法,该方法会显示文件已成功下载的消息。除了我在做一些非常愚蠢的事情而且似乎无法让它发挥作用。

我在 this question 上使用 Ahmet Akkök 的答案,当我尝试使用 yourOwnObject.showDownloadCompleted() 时找不到方法。

任何和所有的帮助将不胜感激!

ViewController 中的代码:

override func viewDidLoad()

    super.viewDidLoad();
    let pdfURL = "exampleToPFD.com/mypdf.pdf";

    let url = NSURL(string: pdfURL);

    let d = Downloader(yourOwnObject: self);
    d.download(url!);



func showDownloadComplete()
    print("done");

The Downloader.swift 中的代码:

import Foundation

class Downloader : NSObject, NSURLSessionDownloadDelegate
var url : NSURL?

// will be used to do whatever is needed once download is complete
var yourOwnObject : NSObject?
var downloaded = false;
var documentDestination = "";

init(yourOwnObject : NSObject)
    self.yourOwnObject = yourOwnObject



//is called once the download is complete
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL)
    //copy downloaded data to your documents directory with same names as source file
    let documentsUrl =  NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first
    let destinationUrl = documentsUrl!.URLByAppendingPathComponent(url!.lastPathComponent!)
    let dataFromURL = NSData(contentsOfURL: location)
    dataFromURL!.writeToURL(destinationUrl, atomically: true)

    //now it is time to do what is needed to be done after the download

    print("download done...");
    // call to the parent method here

    documentDestination = destinationUrl.absoluteString;
    print("DestURL" + (destinationUrl.absoluteString));


//method to be called to download
func download(url: NSURL)

    self.url = url

    //download identifier can be customized. I used the "ulr.absoluteString"
    let sessionConfig = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(url.absoluteString)
    let session = NSURLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil)
    let task = session.downloadTaskWithURL(url);

    task.resume();


【问题讨论】:

请仅发布与您的问题相关的代码 【参考方案1】:

您可以使用委托来实现这一点。你可以试试下面的

下载器.swift

import Foundation

protocol DownloadDelegate 
    func downloadCompleted()


class Downloader : NSObject, NSURLSessionDownloadDelegate
var url : NSURL?
var downloadDelegate : DownloadDelegate!
// will be used to do whatever is needed once download is complete
var downloaded = false;
var documentDestination = "";

//is called once the download is complete
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL)
    //copy downloaded data to your documents directory with same names as source file
    let documentsUrl =  NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first
    let destinationUrl = documentsUrl!.URLByAppendingPathComponent(url!.lastPathComponent!)
    let dataFromURL = NSData(contentsOfURL: location)
    dataFromURL!.writeToURL(destinationUrl, atomically: true)

    //now it is time to do what is needed to be done after the download

    print("download done...");
    downloadDelegate. downloadCompleted()

    documentDestination = destinationUrl.absoluteString;
    print("DestURL" + (destinationUrl.absoluteString));


//this is to track progress
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64)
    print((String)(totalBytesWritten)+"/"+(String)(totalBytesExpectedToWrite));



// if there is an error during download this will be called
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?)

    if(error != nil)

        //handle the error
        print("Download completed with error: \(error!.localizedDescription)");

    




//method to be called to download
func download(url: NSURL)

    self.url = url

    //download identifier can be customized. I used the "ulr.absoluteString"
    let sessionConfig = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(url.absoluteString)
    let session = NSURLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil)
    let task = session.downloadTaskWithURL(url);

    task.resume();


视图控制器:

class ViewController: UIViewController,DownloadDelegate
    override func viewDidLoad()

        super.viewDidLoad();
        // Do any additional setup after loading the view, typically from a nib.
        let pdfURL = "exampleToPFD.com/mypdf.pdf";

        let url = NSURL(string: pdfURL);

        let d = Downloader();
        d.downloadDelegate = self
        d.download(url!);


        showToast("Download Started...");

    

    func downloadCompleted() 
       //download completed
    

【讨论】:

感谢您的回答!似乎在我的视图控制器中使用未声明的类型“DownloadDelegate”?我是否错过了一些非常小的东西,并且我会用头​​撞到桌子上? 协议名称有拼写错误。确保它在 Downloader.swift 中的 DownloadDelegate 而不是 DownloadDelgate

以上是关于从类中调用父方法的主要内容,如果未能解决你的问题,请参考以下文章

无法从类内部调用 ExtJS 类中的方法

Grails / Spock:如何在类中模拟从类本身调用方法的单个方法?

使用 node express 从类中渲染方法

使用线程安全方法从类中的多个方法填充 Collection 或 Map

java如何调用父类的父类中被覆盖的方法

机器人框架:无法使用 __eq__ 方法从类中获取关键字