2015-09-29 42 views
-1

我有一個頁面顯示來自數據庫的消息。消息正在被加載,因爲它應該,但是當我嘗試重新加載它顯示新的消息,間隔一分鐘後,我得到的消息超出範圍。由於某種原因,它看起來像數組是空的。我已經閱讀了很多解決方案,但其中沒有解釋我的代碼中發生了什麼。間隔快速讀取數組顯示索引超出範圍

這是完整的代碼。

import UIKit 
import Foundation 

class LeftSideViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 


    @IBOutlet weak var answerPMTapped: UIButton! 
    @IBOutlet weak var senderProfileImage: UIImageView! 
    @IBOutlet weak var profileImageView: UIImageView! 
    @IBOutlet weak var BodyMessage: UITextView! 
    @IBOutlet weak var TitleMessage: UILabel! 
    @IBOutlet weak var totalKm: UILabel! 
    @IBOutlet weak var ranking: UILabel! 
    @IBOutlet weak var totalCollected: UILabel! 
    @IBOutlet weak var profileName: UILabel! 
    @IBOutlet weak var euroSign: UILabel! 



    var MessageId = [String]() 
    var MessageSender = [String]() 
    var MessageReceiver = [String]() 
    var MessageBody = [String]() 
    var MessageTime = [String]() 
    var MessageDate = [String]() 
    var MessageStatus = [String]() 
    var MessageTitle = [String]() 
    var SenderUsername = [String]() 
    var ReplyMessageId = [String]() 

    var T_message_Title:String! 

    var menuItems:[String] = ["Home","Profiel", "Goede Doelen", "Berichten", "Verstuur bericht", "Instellingen","Uitloggen"]; 

    var menuImage: [String] = ["home", "profile", "charity", "message", "reply", "settings", "logout"] 

    var urlString = String() 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     self.navigationController?.navigationBarHidden = true 
     load_message() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     get_user_data() 
     get_my_message_list() 

     /* if (TitleMessage != nil){ 
      var title_convert = MessageTitle[1] 
      var message_convert = MessageBody[1] 
      TitleMessage.text = title_convert 
      BodyMessage.text = message_convert 
     } else { 
      BodyMessage.text = "Er zijn geen berichten op dit moment." 
     } */ 

     let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults() 
     var userEmail = prefs.valueForKey("USERNAME") as! String 

     let newUsername = userEmail.stringByReplacingOccurrencesOfString(".", withString: "") 
     let NewUserName = newUsername.stringByReplacingOccurrencesOfString("@", withString: "") 
     let imgString = NewUserName 

     var urlString = "xxxxxxxx/profile/image/\(imgString).jpg" 

     euroSign.hidden = true 

     if (totalCollected != nil) { 
      euroSign.hidden = false 
     } 

     self.profileImageView.layer.cornerRadius = self.profileImageView.frame.size.width/2; 
     self.profileImageView.clipsToBounds = true; 

     load_profile_image(urlString) 
     var reload_messages = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("message_Reloader"), userInfo: nil, repeats: true) 


    } 

    func message_Reloader(){ 
     self.MessageId.removeAll() 
     self.MessageSender.removeAll() 
     self.MessageReceiver.removeAll() 
     self.MessageBody.removeAll() 
     self.MessageTime.removeAll() 
     self.MessageDate.removeAll() 
     self.MessageStatus.removeAll() 
     self.MessageTitle.removeAll() 
     self.SenderUsername.removeAll() 
     self.ReplyMessageId.removeAll() 
     get_my_message_list() 
     load_message() 
    } 

    func load_profile_image(urlString: String){ 
     var imgURL: NSURL = NSURL(string: urlString)! 
     let request: NSURLRequest = NSURLRequest(URL: imgURL) 
     NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!, data: NSData!,error: NSError!) -> Void in 
      if error == nil { 
       self.profileImageView.image = UIImage(data: data) 
       println(imgURL) 
      } 
     }) 
    } 



    func get_user_data(){ 
     let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults() 
     var userEmail = prefs.valueForKey("USERNAME") as! String 

     let url = NSURL(string:"xxxxxx/fetch-user-profile.php") 
     let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData 
     var request = NSMutableURLRequest(URL: url!, cachePolicy: cachePolicy, timeoutInterval: 2.0) 
     request.HTTPMethod = "POST" 

     // set Content-Type in HTTP header 
     let boundaryConstant = "----------V2ymHFg03esomerandomstuffhbqgZCaKO6jy"; 
     let contentType = "multipart/form-data; boundary=" + boundaryConstant 
     NSURLProtocol.setProperty(contentType, forKey: "Content-Type", inRequest: request) 

     // set data 
     var dataString = "username=\(userEmail)" 
     let requestBodyData = (dataString as NSString).dataUsingEncoding(NSUTF8StringEncoding) 
     request.HTTPBody = requestBodyData 

     // set content length 
     //NSURLProtocol.setProperty(requestBodyData.length, forKey: "Content-Length", inRequest: request) 

     var response: NSURLResponse? = nil 
     var error: NSError? = nil 
     let dataReply = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&error) 


     if(dataReply != nil){ 
      let res = response as! NSHTTPURLResponse!; 

      NSLog("Response code: %ld", res.statusCode); 

      if (res.statusCode >= 200 && res.statusCode < 300) 
      { 

     var results = NSJSONSerialization.JSONObjectWithData(dataReply!, options: nil, error: &error) as! NSDictionary 

     NSLog("PostData: %@",dataReply!); 

     NSLog("ResultData: %@",results); 

     var jsonOutput = JSON(data: dataReply!) 


     totalKm.text = jsonOutput["total_km"].stringValue 
     totalCollected.text = jsonOutput["collected"].stringValue 
     ranking.text = jsonOutput["rank"].stringValue 
     profileName.text = jsonOutput["username"].stringValue 

      } else { 

       println("Fetching data failed.") 


      } 

     } else { 

      println("Fetching data failed.") 
     } 

    } 

     func load_message(){ 
      println("\(MessageBody[0])") 
      var messagebody = MessageBody[0] 
      var messagetitle = MessageTitle[0] 

      var messagesender = MessageSender[0] 

      let newUsername = messagesender.stringByReplacingOccurrencesOfString(".", withString: "") 
      let NewUserName = newUsername.stringByReplacingOccurrencesOfString("@", withString: "") 
      let imgString = NewUserName 

      var urlString = "xxxxxxxxx/profile/image/\(imgString).jpg" 

      self.senderProfileImage.layer.cornerRadius = self.senderProfileImage.frame.size.width/2; 
      self.senderProfileImage.clipsToBounds = true; 

      var imgURL: NSURL = NSURL(string: urlString)! 
      let request: NSURLRequest = NSURLRequest(URL: imgURL) 
      NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!, data: NSData!,error: NSError!) -> Void in 
       if error == nil { 
        self.senderProfileImage.image = UIImage(data: data) 
        println(imgURL) 
       } 
      }) 


      if (messagetitle.isEmpty){ 
       BodyMessage.text = "Er zijn geen berichten op dit moment." 

      } 
      else { 
       TitleMessage.text = messagetitle 
       BodyMessage.text = messagebody 
      } 
    } 

    @IBAction func answerPM(sender: AnyObject) { 

     var messageid = MessageId[0] 
     var messagesender = MessageSender[0] 
     var messagereceiver = MessageReceiver[0] 
     var senderusername = SenderUsername[0] 
     var replymessageid = ReplyMessageId[0] 

     // send over the orignal message so we can use that info to show the message again when they click the back button 
     var messagedate = MessageDate[0] 
     var messagebody = MessageBody[0] 
     var messagetitle = MessageTitle[0] 
     var messagetime = MessageTime[0] 
     var messagesendeR = MessageSender[0] 


     var centerViewController = self.storyboard?.instantiateViewControllerWithIdentifier("answerMessage") as! answerMessageView 

     centerViewController.MessageId2 = messageid 
     centerViewController.MessageSender2 = messagesender 
     centerViewController.MessageReceiver2 = messagereceiver 
     centerViewController.SenderUsername2 = senderusername 
     centerViewController.ReplyMessageId2 = replymessageid 
     println("sender username: \(senderusername) reply message id: \(replymessageid)") 
     centerViewController.A_messagedate = messagedate 
     centerViewController.A_messagebody = messagebody 
     centerViewController.A_messagetitle = messagetitle 
     centerViewController.A_messagetime = messagetime 
     centerViewController.A_messagesendeR = messagesendeR 


     var centerNavController = UINavigationController(rootViewController: centerViewController) 

     var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

     appDelegate.centerContainer!.centerViewController = centerNavController 
     appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil) 

    } 

    @IBAction func viewAllMessages(sender: AnyObject) { 
     var userProfiles = self.storyboard?.instantiateViewControllerWithIdentifier("messagesList") as! MessagesView 

     var userProfileNav = UINavigationController(rootViewController: userProfiles) 

     var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

     appDelegate.centerContainer!.centerViewController = userProfileNav 
     appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil) 
    } 

    @IBAction func markMGSRead(sender: AnyObject) { 
    } 





    func get_my_message_list(){ 

     let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults() 
     var receiverEmail = prefs.valueForKey("USERNAME") as! String 


     println("userEmail: \(receiverEmail)") 


     let request = NSMutableURLRequest(URL: NSURL(string: "xxxxxxxxxx/user/fetchmymessages.php")!) 
     //let urlEncodedString = urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) 
     request.HTTPMethod = "POST" 
     var postData = "receiveremail=\(receiverEmail)" 
     request.HTTPBody = postData.dataUsingEncoding(NSUTF8StringEncoding) 
     NSLog("data: \(request)") 
     var task = NSURLSession.sharedSession().dataTaskWithRequest(request) {(data, response, innerError) in 
      NSLog("response: \(response)") 
      let json = JSON(data: data) 

      if json != nil { 

       let mysocialArray = json.arrayValue 

       NSLog("\(json)") 

       dispatch_async(dispatch_get_main_queue(), { 

        for mysociallist in mysocialArray 
        { 
         let messageId = mysociallist["message_id"].stringValue 
         let sender = mysociallist["sender"].stringValue 
         let receiver = mysociallist["receiver"].stringValue 
         let messageBody = mysociallist["message"].stringValue 
         let time = mysociallist["time"].stringValue 
         let date = mysociallist["date"].stringValue 
         let messageStatus = mysociallist["message_read"].stringValue 
         let messagesubject = mysociallist["message_title"].stringValue 
         let senderusername = mysociallist["sender_username"].stringValue 
         let replymessageid = mysociallist["reply_message_id"].stringValue 


         println("message id: \(messageId)") 
         println("message sender: \(sender)") 
         self.MessageId.append(messageId) 
         self.MessageSender.append(sender) 
         self.MessageReceiver.append(receiver) 
         self.MessageBody.append(messageBody) 
         self.MessageTime.append(time) 
         self.MessageDate.append(date) 
         self.MessageStatus.append(messageStatus) 
         self.MessageTitle.append(messagesubject) 
         self.SenderUsername.append(senderusername) 
         self.ReplyMessageId.append(replymessageid) 


        } 


       }) 

      }else { 

       var alertView:UIAlertView = UIAlertView() 
       alertView.title = "Berichten ophalen mislukt" 
       alertView.message = "Er is een fout opgetreden, daardoor kunnen de berichten niet tonen." 
       alertView.delegate = self 
       alertView.addButtonWithTitle("OK") 
       alertView.show() 
      } 

     } 


     task.resume() 

    }// end of get my message list 





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


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

     var mycell = tableView.dequeueReusableCellWithIdentifier("MyCell") as! MyCustomTableViewCell 

     mycell.menuItemLabel?.text = menuItems[indexPath.row] 

     mycell.menuItemImage?.image = UIImage(named: menuImage[indexPath.row]) 

     return mycell 

    } 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     switch(indexPath.row) 
     { 

     case 0: 

      var centerViewController = self.storyboard?.instantiateViewControllerWithIdentifier("memberArea") as! userOverview 

      var centerNavController = UINavigationController(rootViewController: centerViewController) 

      var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

      appDelegate.centerContainer!.centerViewController = centerNavController 
      appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil) 



      break; 

     case 1: 

      var userProfiles = self.storyboard?.instantiateViewControllerWithIdentifier("userProfile") as! userProfile 

      var userProfileNav = UINavigationController(rootViewController: userProfiles) 

      var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

      appDelegate.centerContainer!.centerViewController = userProfileNav 
      appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil) 

      break; 

     case 2: 

      var userProfiles = self.storyboard?.instantiateViewControllerWithIdentifier("userProfile") as! userProfile 

      var userProfileNav = UINavigationController(rootViewController: userProfiles) 

      var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

      appDelegate.centerContainer!.centerViewController = userProfileNav 
      appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil) 

      break; 




     case 3: 

      var userProfiles = self.storyboard?.instantiateViewControllerWithIdentifier("messagesList") as! MessagesView 

      var userProfileNav = UINavigationController(rootViewController: userProfiles) 

      var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

      appDelegate.centerContainer!.centerViewController = userProfileNav 
      appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil) 

      break; 

     case 4: 

      var userProfiles = self.storyboard?.instantiateViewControllerWithIdentifier("answerMessage") as! answerMessageView 

      var userProfileNav = UINavigationController(rootViewController: userProfiles) 

      var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

      appDelegate.centerContainer!.centerViewController = userProfileNav 
      appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil) 

      break; 

     case 5: 

      var userProfiles = self.storyboard?.instantiateViewControllerWithIdentifier("answerMessage") as! answerMessageView 

      var userProfileNav = UINavigationController(rootViewController: userProfiles) 

      var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

      appDelegate.centerContainer!.centerViewController = userProfileNav 
      appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil) 

      break; 

     case 6: 


      let appDomain = NSBundle.mainBundle().bundleIdentifier 
      NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain!) 

      self.performSegueWithIdentifier("loggin_out", sender: self) 

      break; 

     default: 

      println("\(menuItems[indexPath.row]) is selected"); 

     } 
    } 
} 

這是完整的代碼,但就是給人錯誤以下被稱爲當部分,

override func viewDidLoad() { 
     super.viewDidLoad() 

     var reload_messages = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("message_Reloader"), userInfo: nil, repeats: true) 


    } 

    func message_Reloader(){ 
     self.MessageId.removeAll() 
     self.MessageSender.removeAll() 
     self.MessageReceiver.removeAll() 
     self.MessageBody.removeAll() 
     self.MessageTime.removeAll() 
     self.MessageDate.removeAll() 
     self.MessageStatus.removeAll() 
     self.MessageTitle.removeAll() 
     self.SenderUsername.removeAll() 
     self.ReplyMessageId.removeAll() 
     get_my_message_list() 
     load_message() 
    } 

我已經離開了viewDidLoad中的一小部分,使其不會太長。

我不是一個專業人士,所以我真的可以在這裏使用一些幫助來弄清楚如何調用該函數並將其存儲在數組中,以便我可以顯示新消息。

希望有人能給我一些代碼示例,或者可以將我指向正確的方向,我真的被困在這裏,它不斷崩潰我的應用程序。

感謝

+2

您應該嘗試在您的問題中顯示[MCVE](http://stackoverflow.com/help/mcve)而不是所有此代碼。 – Moritz

回答

0

您在代碼中有一個race conditionget_my_message_list()方法是異步的,所以load_message()可以完成get_my_message_list()之前被調用。在load_message()你想在索引0來訪問數組成員:

...  
var messagebody = MessageBody[0] 
var messagetitle = MessageTitle[0] 
... 

而這就是問題所在:這些陣列可以是空的(如果get_my_message_list()仍未更新它們)。

+0

好吧,我看到是的,所以在我的情況下,我應該使函數同步,以便在調用第二個函數之前調用並完成。我得到正確的。 – carlosx2

+0

不,在你的情況下使功能同步將是錯誤的 - 因爲你會在網絡調用執行時阻塞主線程。 –

+0

我會添加一個回調參數給get_my_message_list(),它應該在完成後調用(並從那裏調用load_message)。請參閱http://zeroheroblog.com/ios/how-to-use-blocks-as-callbacks作爲例子。 –