2016-06-24 1 views
-1

간단한 뉴스 앱을 만들고 NSUserDefaults에 오프라인 읽기 용으로 (제목, 설명, 날짜, 데이터가있는 이미지) 저장하려고합니다. NSUserDefaults에 데이터를 저장하면 오프라인 상태로 표시되고 새 데이터를 사용할 수있게되면 이전 데이터로 다시 쓰거나 바뀝니다. NSUserDefaults에서 문자열 배열을 저장하는 방법을 알고 있지만 이미지가 NSUserDefaults에 저장된 방법에 대해 제대로 알지 못했습니다. 나는 데이터를 저장하는 논리를 만들고 새로운 데이터를 사용할 수 있는지 확인하려고하지만 성공하지 못했습니다. 또한 스플래시 화면이 사라질 시간이 더 오래 걸리며 서버에서 데이터를로드하거나 느린 인터넷 연결로 인해 발생합니까? 누구든지 내 코드를 점검하여 문제를 해결할 수 있습니까? 에 NSUserDefault에 대용량 데이터를 저장 감사NSUserDefaults 또는 Documents Directory에 XML 데이터 저장

class ViewController2: UIViewController ,NSXMLParserDelegate { 

    let newsDefaults = NSUserDefaults.standardUserDefaults() 

    @IBOutlet weak var tableView: UITableView! 

    var parser = NSXMLParser() 
    var posts = NSMutableArray() 
    var elements = NSMutableDictionary() 
    var element = NSString() 
    var title1 = NSMutableString() 
    var date = NSMutableString() 
    var link = NSMutableString() 
    var des = NSMutableString() 
    var img2 = NSMutableString() 


    var NSUserDefaultsTitle : [NSString] = [] 
    var NSUserDefaultsDate : [NSString] = [] 
    var NSUserDefaultsDes : [NSString] = [] 

    var NSUserDefaultsImage : [UIImage] = [] 

    typealias CompletionHandler = (image: UIImage) -> Void 

    var attrsUrl : [String : NSString]! 
    var urlPic : NSString? 

    var postLink: String = String() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.configure() 

     self.beginParsing() 
    } 

    override func viewWillAppear(animated: Bool) { 
//  if let HaveTitle = newsDefaults.objectForKey("t"){ 
//   NSUserDefaultsTitle = HaveTitle.mutableCopy() as! [NSString] 
//  } 
//  if let HaveDate = newsDefaults.objectForKey("d"){ 
//   NSUserDefaultsDate = HaveDate.mutableCopy() as! [NSString] 
//  } 
//  if let HaveDes = newsDefaults.objectForKey("des"){ 
//   NSUserDefaultsDes = HaveDes.mutableCopy() as! [NSString] 
//  } 
//  if let imageData = newsDefaults.objectForKey("imgData"){ 
//   NSUserDefaultsImage = imageData.mutableCopy() as! [UIImage] 
//  } 
// 
//  print(newsDefaults.objectForKey("d")) 
    } 

    func beginParsing() 
    { 
     posts = [] 
     parser = NSXMLParser(contentsOfURL:(NSURL(string: "http://www.voanews.com/api/zq$omekvi_"))!)! 
     parser.delegate = self 
     parser.parse() 

     tableView!.reloadData() 
    } 

    //XMLParser Methods 

    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) 
    { 
     element = elementName 
     if (elementName as NSString).isEqualToString("item") 
     { 
      elements = NSMutableDictionary() 
      elements = [:] 
      title1 = NSMutableString() 
      title1 = "" 
      date = NSMutableString() 
      date = "" 
      link = NSMutableString() 
      link = "" 
      des = NSMutableString() 
      des = "" 
      img2 = NSMutableString() 
      img2 = "" 
     } 
     if elementName == "enclosure" { 
      attrsUrl = attributeDict as [String: NSString] 
      urlPic = attrsUrl["url"] 
      print(urlPic!, terminator: "") 

     } 
    } 

    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) 
    { 
     if (elementName as NSString).isEqualToString("item") { 
      if !title1.isEqual(nil) { 
       elements.setObject(title1, forKey: "title") 
      } 
      if !date.isEqual(nil) { 
       elements.setObject(date, forKey: "pubDate") 
      } 
      if !link.isEqual(nil) { 
       elements.setObject(link, forKey: "link") 
      } 
      if !des.isEqual(nil){ 
       elements.setObject(des, forKey: "description") 
      } 
      if !img2.isEqual(nil){ 
       elements.setObject(urlPic!, forKey: "enclosure") 
      } 

      posts.addObject(elements) 
// 
//   if let HaveData = newsDefaults.objectForKey("post"){ 
// 
//   }else{ 
//    
////    newsDefaults.setObject(self.posts.valueForKey("title"), forKey: "t") 
////    newsDefaults.setObject(self.posts.valueForKey("pubDate"), forKey: "d") 
////    newsDefaults.setObject(self.posts.valueForKey("description"), forKey: "des") 
//     
//    newsDefaults.setObject(posts, forKey: "post") 
//     
       print("elementName") 
//   } 
     } 
     print("didEndElement") 

    } 

    func parser(parser: NSXMLParser, foundCharacters string: String) 
    { 
     if element.isEqualToString("title") { 
      title1.appendString(string) 
     } else if element.isEqualToString("pubDate") { 
      date.appendString(string) 
      print(date) 
     } 
     else if element.isEqualToString("link"){ 
      link.appendString(string) 
     }else if element.isEqualToString("description"){ 
      des.appendString(string) 
     }else if element.isEqualToString("enclosure"){ 
      img2.appendString(string) 
     } 
     print("foundCharacter") 
    } 

    private func configure() { 
     self.navigationController?.navigationBar.titleTextAttributes = [NSFontAttributeName: UIFont.boldSystemFontOfSize(20.0), NSForegroundColorAttributeName: UIColor.whiteColor()] 

     self.tableView.registerNib(UINib(nibName: "2ImageCell", bundle: nil), forCellReuseIdentifier: "imageCell") 
     self.tableView.delegate = self 
     self.tableView.dataSource = self 

     self.fillNavigationBar(color: UIColor(red: 252.0/255.0, green: 0, blue: 0, alpha: 1.0)) 

    } 

    private func fillNavigationBar(color color: UIColor) { 
     if let nav = self.navigationController { 
      nav.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default) 
      nav.navigationBar.shadowImage = UIImage() 
      for view in nav.navigationBar.subviews { 
       if view.isKindOfClass(NSClassFromString("_UINavigationBarBackground")!) { 
        if view.isKindOfClass(UIView) { 
         (view as UIView).backgroundColor = color 
        } 
       } 
      } 
     } 
    } 
} 

extension ViewController2: UITableViewDelegate, UITableViewDataSource { 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     self.tableView.deselectRowAtIndexPath(indexPath, animated: true) 

     let view = ImageModalView2.instantiateFromNib() 
     view.des.text = posts.objectAtIndex(indexPath.row).valueForKey("description") as? String 

     downloadFileFromURL(NSURL(string: self.posts.objectAtIndex(indexPath.row).valueForKey("enclosure") as! String)!, completionHandler:{(img) in 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       view.image = img 
      }) 
     }) 

     let window = UIApplication.sharedApplication().delegate?.window! 
     let modal = PathDynamicModal.show(modalView: view, inView: window!) 
     view.closeButtonHandler = {[weak modal] in 
      modal?.closeWithLeansRandom() 
      return 
     } 
    } 

    @IBAction func printData(sender: AnyObject) { 
     print(NSUserDefaultsImage) 

    } 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
     return 80.0 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return posts.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = self.tableView.dequeueReusableCellWithIdentifier("imageCell", forIndexPath: indexPath) as! ImageCell2 
//  if let picURL = user["picture"].string, url = NSURL(string: picURL) { 
//   if let data = NSData(contentsOfURL: url) { 
//    cell!.imageView?.image = UIImage(data: data) 
//   } 
     cell.titleLabel.text = posts.objectAtIndex(indexPath.row).valueForKey("title") as! NSString as String 
//  if NSUserDefaultsImage    { 
//   cell.sideImageView.image = NSUserDefaultsImage[indexPath.row] 
//  }else{ 
     downloadFileFromURL(NSURL(string: self.posts.objectAtIndex(indexPath.row).valueForKey("enclosure") as! String)!, completionHandler:{(img) in 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       cell.sideImageView.image = img 
//    self.NSUserDefaultsImage.append(img) 
//    print(img) 
//    self.newsDefaults.setObject(self.NSUserDefaultsImage, forKey: "imgData") 
      }) 
     }) 
// } 
     //cell.date.text = posts.objectAtIndex(indexPath.row).valueForKey("pubDate") as? String 
     //cell.sideImageView?.contentMode = UIViewContentMode.ScaleAspectFit 
     //cell.sideImageView?.image = image 
     cell.titleLabel.userInteractionEnabled = false 
     cell.titleLabel.editable = false 
     cell.titleLabel.selectable = false 
     return cell 
    } 


    func downloadFileFromURL(url1: NSURL?,completionHandler: CompletionHandler) { 
     // download code. 
     if let url = url1{ 
      let priority = DISPATCH_QUEUE_PRIORITY_HIGH 
      dispatch_async(dispatch_get_global_queue(priority, 0)) { 
       let data = NSData(contentsOfURL: url) 
       if data != nil { 
        print("image downloaded") 
        completionHandler(image: UIImage(data: data!)!) 
       } 
      } 
     } 
    } 


} 

답변

0

이미지를 NSUserDefaults에 저장하려면 거기에 허용되는 특정 유형 만 있으므로 NSData로 변환해야합니다.

오프라인보기를 위해 거기에 정보를 저장하는 아이디어는 ... 응용 프로그램 문서 디렉토리의 작업과 비슷합니다. 개체에서 NSCoding 프로토콜을 사용하고 기본 개체에서 NSKeyedArchiver : archiveRootObject : toFile을 호출하여 모든 정보를 디스크에 쓸 수 있어야하며 모든 자식 개체에서 encodeWithCoder를 호출합니다.

0

애플에서 권장하지 않는 우리는 많은 데이터를 저장해서는 안된다. NSUserDefault 또는 키 체인 우리는 "사용자 이름", "암호"를 저장하는 데 사용합니다.

CoreData 또는 Sqlite을 사용하여 데이터로 작업 할 수 있습니다.

관련 문제