首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >alloc()错误

alloc()错误
EN

Stack Overflow用户
提问于 2015-09-18 11:13:57
回答 2查看 203关注 0票数 1

因此,我刚刚将我的Speed2.0更新为2.0,很明显,我的代码中出现了一些错误。这就是我现在所拥有的。

代码语言:javascript
复制
unc loadRssFeed(data: NSURL) {

    var myRssParser : ParserManager = ParserManager.alloc().initWithURL(data) as! ParserManager

    myRssFeed = myRssParser.feeds

    tableView.reloadData()
}

Fixit建议将'var‘改为'let’,并使用对象初始化器而不是alloc()。但问题是,我以前从未使用过它(当然,我的Swift体验大概是4周)。

我应该遵守固定指令吗?以及如何解决alloc()问题。

谢谢!

更新后的wit解析器代码:

代码语言:javascript
复制
class ParserManager: NSObject, NSXMLParserDelegate {

var parser = NSXMLParser()
var feeds = NSMutableArray()
var elements = NSMutableDictionary()
var element = NSString()
var ftitle = NSMutableString()
var link = NSMutableString()
var fdescription = NSMutableString()
var fdate = NSMutableString()


func initWithURL(url :NSURL) -> AnyObject {
    startParse(url)
    return self
}
func startParse(url :NSURL) {
    feeds = []
    parser = NSXMLParser(contentsOfURL: url)!
    parser.delegate = self
    parser.shouldProcessNamespaces = false
    parser.shouldReportNamespacePrefixes = false
    parser.shouldResolveExternalEntities = false
    parser.parse()
}

func allFeeds() -> NSMutableArray {
    return feeds
}
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {

    self.element = elementName

    if self.element == "item" {

        self.ftitle = ""
        self.fdescription = ""

        self.fdate = ""

    }
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {

    if (elementName as NSString).isEqualToString("item") {
        if ftitle != "" {
            elements.setObject(ftitle, forKey: "title")
        }



        if fdescription != "" {
            elements.setObject(fdescription, forKey: "description")
        }

        if fdate != "" {
            elements.setObject(fdate, forKey: "pubDate")
        }

        feeds.addObject(elements)
    }

}
func parser(parser: NSXMLParser, foundCharacters string: String?) {

    if element.isEqualToString("title") {
        ftitle.appendString(string!)

    }else if element.isEqualToString("description") {
        fdescription.appendString(string!)
    }else if element.isEqualToString("pubDate") {
        fdate.appendString(string!)
    }
}


}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-18 14:12:43

如上所述,您不应该直接调用allocinit...方法。此外,ParserManager类不应该有一个initWithURL方法,而应该有一个带有URL参数的init方法。现有的代码似乎遵循Objective模式,但是Swift有自己的约定。

但更广泛地说,我建议不要执行同步网络请求,当您调用NSXMLParser(contentsOfURL:)时,情况就是这样。最好是异步请求数据,然后重构代码以遵循异步模式(例如,completionHandler闭包)。例如:

代码语言:javascript
复制
class ParserManager: NSObject, NSXMLParserDelegate {

    /// The NSMutableArray used internally by this class

    private var feeds = NSMutableArray()

    /// Initiate parsing asynchronously; note, I'm returning the `NSURLSessionTask` in case you want to cancel it at some later point

    func parse(URL: NSURL, completionHandler: (NSMutableArray?, NSError?)->()) -> NSURLSessionTask {
        let task = NSURLSession.sharedSession().dataTaskWithURL(URL) { data, response, error in
            guard data != nil else {
                dispatch_async(dispatch_get_main_queue()) {
                    completionHandler(nil, error)
                }
                return
            }

            let parser = NSXMLParser(data: data!)
            parser.delegate = self

            if parser.parse() {
                dispatch_async(dispatch_get_main_queue()) {
                    completionHandler(self.feeds, nil)
                }
            } else {
                dispatch_async(dispatch_get_main_queue()) {
                    completionHandler(nil, parser.parserError)
                }
            }
        }
        task.resume()

        return task
    }

    // NSXMLParserDelegate methods implemented here

}

然后,您可以使用完成处理程序语法来指定在完成网络请求和解析时要做的事情:

代码语言:javascript
复制
let URL = NSURL(string: "...")
let myRssParser = ParserManager()
myRssParser.parse(URL) { feeds, error in
    guard feeds != nil else {
        print(error)
        return
    }

    // use `feeds` here, e.g.

    self.feeds = feeds            // update your local property
    self.tableView.reloadData()   // and reload the table
}

// but don't use `feeds` here, since it won't be done by the time we get here
票数 1
EN

Stack Overflow用户

发布于 2015-09-18 11:20:52

修复程序应该如下所示:

代码语言:javascript
复制
let myRssParser = ParserManager(URL: data) as! ParserManager

或者像这样,取决于ParserManager是如何编写的:

代码语言:javascript
复制
let myRssParser = ParserManager(url: data) as! ParserManager

甚至有一种可能,您不必使用参数名:

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

https://stackoverflow.com/questions/32650620

复制
相关文章

相似问题

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