2015-01-11 1 views
0

Итак, я искал другие вопросы, где люди сталкиваются с этой проблемой, но я не могу найти того, где моя проблема решается.Swift - ReloadData не работает

Я хочу использовать кнопку, чтобы обновить и загрузить новые данные в моей Tableview, и с той же кнопкой я извлечения данных:

@IBOutlet var tv: UITableView! 
@IBAction func refreshTapped(sender: AnyObject) { 
    var query = PFQuery(className:"textMessage") 
    query.whereKey("Receiver", equalTo:PFUser.currentUser().username) 
    query.findObjectsInBackgroundWithBlock { 
     (objects: [AnyObject]!, error: NSError!) -> Void in 
     if error == nil { 
      NSLog("Successfully retrieved \(objects.count) scores.") 
      var image = UIImage() 


      for object in objects{ 

      let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
      let contxt: NSManagedObjectContext = appDel.managedObjectContext! 
      let ene = NSEntityDescription.entityForName("MessageInformation", inManagedObjectContext: contxt) 
      var newMessage = Messages(entity: ene!, insertIntoManagedObjectContext: contxt) 

      let type = object["MessageType"] as Int 

       switch type{ 

       case 0: 
        let message: String = object["Message"] as String 
        let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).txt" 
        message.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: nil) 
        println(path) 
        newMessage.sender = object["Receiver"] as String 

       case 1: 
        let userImageFile = object["Image"] as PFFile 
        userImageFile.getDataInBackgroundWithBlock { 
         (imageData: NSData!, error: NSError!) -> Void in 
         if error == nil { 
          image = UIImage(data:imageData) 
          let imageToSave:NSData = UIImagePNGRepresentation(image) 
          let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).png" 
          imageToSave.writeToFile(path, atomically: true) 
          println(path) 
         } 
        } 
       newMessage.sender = object["Receiver"] as String 

       case 2: 
        let message: String = object["Message"] as String 
        let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).txt" 
        message.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: nil) 
        println(path) 
        newMessage.sender = object["Receiver"] as String 


       case 3: 
        let userImageFile = object["Image"] as PFFile 
        userImageFile.getDataInBackgroundWithBlock { 
         (imageData: NSData!, error: NSError!) -> Void in 
         if error == nil { 
          image = UIImage(data:imageData) 
          let imageToSave:NSData = UIImagePNGRepresentation(image) 
          let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).png" 
          imageToSave.writeToFile(path, atomically: true) 
          println(path) 
         } 
        } 
        newMessage.sender = object["Receiver"] as String 

       default: 
        println("Type not found") 
       } 
      } 
      }else { 
      // Log details of the failure 
      NSLog("Error: %@ %@", error, error.userInfo!) 
     } 
    } 
self.tv.reloadData() 
} 

и это просто не работает, я тоже довольно уверен, что мои ссылки - все хорошо. Вот мой viewDidLoad функция тоже, если это помогает:

override func viewDidLoad() { 
    super.viewDidLoad() 

    var nib = UINib(nibName: "TableViewCell", bundle: nil) 
    tv.registerNib(nib, forCellReuseIdentifier: "cell") 

    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
    let context:NSManagedObjectContext = appDel.managedObjectContext! 

    let fetchReq = NSFetchRequest(entityName: "MessageInformation") 
    let en = NSEntityDescription.entityForName("MessageInformation", inManagedObjectContext: context) 
    let sortDescriptor = NSSortDescriptor(key: "dateReceived", ascending: false) 
    fetchReq.sortDescriptors = [sortDescriptor] 

    messageList = context.executeFetchRequest(fetchReq, error: nil) as [Messages] 

    tv.reloadData() 
} 

Я программировал в стриже на некоторое время теперь, и до сих пор не получил эту функциональность правильно.

Любые предложения о том, как действовать, будут оценены.

EDIT: Мой cellForRowAtIndexPath-функция:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ 

    let longPress: UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: "cellLongPressed:") 
    longPress.delegate = self 
    longPress.minimumPressDuration = 0.5 
    longPress.numberOfTouchesRequired = 1 

    let cell:TableViewCell = self.tv.dequeueReusableCellWithIdentifier("cell") as TableViewCell 
    cell.addGestureRecognizer(longPress) 

    let data = messageList[indexPath.row] as Messages 
    cell.labelOutl.text = data.sender 

    return cell 
} 
+0

Вы перегрузочные данные на главном потоке но обновление данных асинхронно в фоновом режиме ... Какой массив является источником данных для вашей таблицы? –

ответ

2

Ваш self.tv.reloadData() находится вне крышки, поэтому в то время как получение данных будет происходить асинхронно, вы вызываете reloadData немедленно - до того, как данные были получены.

Это должно быть -

@IBOutlet var tv: UITableView! 
@IBAction func refreshTapped(sender: AnyObject) { 
    var query = PFQuery(className:"textMessage") 
    query.whereKey("Receiver", equalTo:PFUser.currentUser().username) 
    query.findObjectsInBackgroundWithBlock { 
     (objects: [AnyObject]!, error: NSError!) -> Void in 
     if error == nil { 
      NSLog("Successfully retrieved \(objects.count) scores.") 
      var image = UIImage() 


      for object in objects{ 

      let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
      let contxt: NSManagedObjectContext = appDel.managedObjectContext! 
      let ene = NSEntityDescription.entityForName("MessageInformation", inManagedObjectContext: contxt) 
      var newMessage = Messages(entity: ene!, insertIntoManagedObjectContext: contxt) 

      let type = object["MessageType"] as Int 

       switch type{ 

       case 0: 
        let message: String = object["Message"] as String 
        let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).txt" 
        message.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: nil) 
        println(path) 
        newMessage.sender = object["Receiver"] as String 

       case 1: 
        let userImageFile = object["Image"] as PFFile 
        userImageFile.getDataInBackgroundWithBlock { 
         (imageData: NSData!, error: NSError!) -> Void in 
         if error == nil { 
          image = UIImage(data:imageData) 
          let imageToSave:NSData = UIImagePNGRepresentation(image) 
          let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).png" 
          imageToSave.writeToFile(path, atomically: true) 
          println(path) 
         } 
        } 
       newMessage.sender = object["Receiver"] as String 

       case 2: 
        let message: String = object["Message"] as String 
        let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).txt" 
        message.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: nil) 
        println(path) 
        newMessage.sender = object["Receiver"] as String 


       case 3: 
        let userImageFile = object["Image"] as PFFile 
        userImageFile.getDataInBackgroundWithBlock { 
         (imageData: NSData!, error: NSError!) -> Void in 
         if error == nil { 
          image = UIImage(data:imageData) 
          let imageToSave:NSData = UIImagePNGRepresentation(image) 
          let path = NSTemporaryDirectory() + "\(Int(self.createRandiAndSaveNumberToCell())).png" 
          imageToSave.writeToFile(path, atomically: true) 
          println(path) 
         } 
        } 
        newMessage.sender = object["Receiver"] as String 

       default: 
        println("Type not found") 
       } 
      } 
      dispatch_async(dispatch_get_main_queue(),{()->() in 
       self.tv.reloadData() 
      }) 
      }else { 
      // Log details of the failure 
      NSLog("Error: %@ %@", error, error.userInfo!) 
     } 
    } 
} 

Но у вас есть еще одна проблема - вы на самом деле ничего не делать с переменной newMessage обновить модель данных

+0

Ну, я добавил «contxt.save (nil)» для каждого случая, чтобы обновлять мою модель данных, я также изменил положение моей reloadData, но ничего не происходит, когда я нажимаю кнопку. Если я перезапущу приложение, тем не менее, заполняется таблица. – martin

+0

Как вы получаете данные из Core Data в таблицу? Вы используете fetchedResultsController? Похоже, что вы не перезагружаете данные из CoreData в любой источник, который вы используете в 'cellForRowAtIndexPath' – Paulw11

+0

Теперь я добавил функцию cellForRowAtIndexPath, я не использую fetchedResultsController. – martin

 Смежные вопросы

  • Нет связанных вопросов^_^