2016-01-14 21 views
1

按下後刷新按鈕的內容加載在UITableView的JSON做如何自動停止活動的指標負載的UITableView後停止活動的指標

我已經有代碼開始紡紗和按鈕

下面是完整的代碼

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var json_data_url = "http://www.howtotechworld.com/json_table_view_images%20(1).json" 
    var image_base_url = "" 
    var isProgressShowing = true; 

    var TableData:Array<datastruct> = Array <datastruct>() 

    enum ErrorHandler:ErrorType 
    { 
     case ErrorFetchingResults 
    } 


    struct datastruct 
    { 
     var imageurl:String? 
     var description:String? 
     var image:UIImage? = nil 

     init(add: NSDictionary) 
     { 
      imageurl = add["url"] as? String 
      description = add["description"] as? String 
     } 
    } 

    @IBOutlet var tableview: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableview.dataSource = self 
     tableview.delegate = self 

     get_data_from_url(json_data_url) 
    } 

    override func viewWillAppear(animated: Bool) { 
     let barButtonItem = UIBarButtonItem(title: "Refresh", style: .Plain, target: self, action: "refreshTapped"); 
     self.navigationItem.rightBarButtonItem = barButtonItem; 
    } 

    func refreshTapped() { 
     addProgressIndicator(isProgressShowing); 
     get_data_from_url(json_data_url) 
    } 

    func addProgressIndicator(show : Bool) { 
     isProgressShowing = !show; 
     if(show) { 
      let myActivityIndicator = UIActivityIndicatorView(activityIndicatorStyle:UIActivityIndicatorViewStyle.Gray) 
      myActivityIndicator.startAnimating() 
      let barButtonItem = UIBarButtonItem(customView: myActivityIndicator) 
      self.navigationItem.rightBarButtonItem = barButtonItem 
     } else { 
      self.navigationItem.rightBarButtonItem = nil; 
     } 




    } 




    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) 

     let data = TableData[indexPath.row] 


     cell.textLabel?.text = data.description 

     if (data.image == nil) 
     { 
      cell.imageView?.image = UIImage(named:"image.jpg") 
      load_image(image_base_url + data.imageurl!, imageview: cell.imageView!, index: indexPath.row) 
     } 
     else 
     { 
      cell.imageView?.image = TableData[indexPath.row].image 
     } 

     return cell 

    } 

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







    func get_data_from_url(url:String) 
    { 


     let url:NSURL = NSURL(string: url)! 
     let session = NSURLSession.sharedSession() 

     let request = NSMutableURLRequest(URL: url) 
     request.HTTPMethod = "GET" 
     request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 


     let task = session.dataTaskWithRequest(request) { 
      (
      let data, let response, let error) in 

      guard let _:NSData = data, let _:NSURLResponse = response where error == nil else { 
       print("error") 
       return 
      } 

      dispatch_async(dispatch_get_main_queue(), { 
       self.extract_json(data!) 
       return 
      }) 

     } 

     task.resume() 

    } 


    func extract_json(jsonData:NSData) 
    { 
     let json: AnyObject? 
     do { 
      json = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) 
     } catch { 
      json = nil 
      return 
     } 

     if let list = json as? NSArray 
     { 
      for (var i = 0; i < list.count ; i++) 
      { 
       if let data_block = list[i] as? NSDictionary 
       { 

        TableData.append(datastruct(add: data_block)) 
       } 
      } 

      do 
      { 
       try read() 
      } 
      catch 
      { 
      } 

      do_table_refresh() 

     } 


    } 




    func do_table_refresh() 
    { 
     dispatch_async(dispatch_get_main_queue(), { 
      self.tableview.reloadData() 
      return 
     }) 
    } 


    func load_image(urlString:String, imageview:UIImageView, index:NSInteger) 
    { 

     let url:NSURL = NSURL(string: urlString)! 
     let session = NSURLSession.sharedSession() 

     let task = session.downloadTaskWithURL(url) { 
      (
      let location, let response, let error) in 

      guard let _:NSURL = location, let _:NSURLResponse = response where error == nil else { 
       print("error") 
       return 
      } 

      let imageData = NSData(contentsOfURL: location!) 

      dispatch_async(dispatch_get_main_queue(), { 


       self.TableData[index].image = UIImage(data: imageData!) 
       self.save(index,image: self.TableData[index].image!) 

       imageview.image = self.TableData[index].image 
       return 
      }) 


     } 

     task.resume() 


    } 




    func read() throws 
    { 

     do 
     { 
      let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
      let managedContext = appDelegate.managedObjectContext! 
      let fetchRequest = NSFetchRequest(entityName: "Images") 

      let fetchedResults = try managedContext.executeFetchRequest(fetchRequest) 

      for (var i=0; i < fetchedResults.count; i++) 
      { 
       let single_result = fetchedResults[i] 
       let index = single_result.valueForKey("index") as! NSInteger 
       let img: NSData? = single_result.valueForKey("image") as? NSData 

       TableData[index].image = UIImage(data: img!) 

      } 

     } 
     catch 
     { 
      print("error") 
      throw ErrorHandler.ErrorFetchingResults 
     } 

    } 

    func save(id:Int,image:UIImage) 
    { 
     let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     let managedContext = appDelegate.managedObjectContext! 

     let entity = NSEntityDescription.entityForName("Images", 
      inManagedObjectContext: managedContext) 
     let options = NSManagedObject(entity: entity!, 
      insertIntoManagedObjectContext:managedContext) 

     let newImageData = UIImageJPEGRepresentation(image,1) 

     options.setValue(id, forKey: "index") 
     options.setValue(newImageData, forKey: "image") 

     do { 
      try managedContext.save() 
     } catch 
     { 
      print("error") 
     } 

    } 


} 
+1

你的'get_data_from_url(json_data_url)'方法怎麼樣? –

+0

虐待添加所有的代碼 – system21

+0

完成更新的代碼 – system21

回答

1

如果我明白你的問題正確的話,我想下面是你想要的。

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){ 
    //end of loading 
    //for example [activityIndicator stopAnimating]; 
} 
} 

和迅速的就是這個樣子

func cellForRowAtIndexPath(_ indexPath: NSIndexPath) -> UITableViewCell?{ 
if(indexPath.row = tableView.indexPathsForVisibleRows().lastObject().row{ 
    //end of loading 
    //for example [activityIndicator stopAnimating]; 
} 
return yourCell; 

}

我不知道多少迅速,但我猜你會得到的想法如何做到這一點。

1

do_table_refresh()後添加以下代碼:addProgressIndicator(!isProgressShowing);

+0

這只是保持活動指標旋轉 – system21

+0

嘗試把它放在'task.resume( )'in'get_data_from_url()' –

+0

這次我點擊刷新它仍然劑量停止 – system21

3

您將需要一個參考保持到myActivityIndicator,並如下圖所示停止在do_table_refresh()

func do_table_refresh() 
{ 
    dispatch_async(dispatch_get_main_queue(), { 
     self.tableview.reloadData() 

     myActivityIndicator.stopAnimating() 
     return 
     }) 
    } 

編輯:在問題中查看您的代碼後,只是有一個快速的想法。

如果您想使用addProgressIndicator(isProgressShowing)myActivitIndicator躲,你將不得不確保isProgressShowing設置爲FALSE,然後在我上面給出的代碼,用addProgressIndicator(isProgressShowing)更換myActivityIndicator.stopAnimating()

您還需要更新addProgressIndicator函數並將myActivityIndicator.stopAnimating()添加到else條件。

+0

我會改變self.table ...和myActivity .....行的順序,但這是正確的方法,你應該停止指標英寸 – turushan

+0

@turushan如果重新加載需要很長時間,不好的編程可能或也許只是很多東西要加載,然後基本上這個指標會在重新加載完成之前隱藏。爲了解決這個問題,我們最好在重新加載表格後停止指標。對於更小/更快的tableview重新加載,延遲將是微不足道的。 –

+0

實際上在你的代碼中stopAnimating()行不會等到reloadData()結束,因爲它不在完成部分,所以在運行時間之後讀取reloadData()在0.00001秒內跳到下一行,並再次停止動畫而不依賴於在reloadData完成與否。 – turushan