2016-04-01 17 views
1

RxSwift'te yeniyim ve UIRefreshControl'ü bir UITableView kullanarak bir hedef oluşturmanın normal yolu yerine nasıl "reaktif olarak" kullanabileceğimi ve beginRefreshing() ve endRefreshing() numaralı çağrıları manuel olarak nasıl arayabileceğimi merak ediyordum . getData() arayıp da Bittiğinde (ferahlatıcı durdurmak için ben refreshControl bağlamak nasıl,Ağ görüşmesinden sonra bir UIRefreshControl bağlama

class TableViewController: UITableViewController { 

    var data : [String] = [] 

    let db = DisposeBag() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     refreshControl = UIRefreshControl() 

     //I don't want to use 
     //refreshControl?.addTarget(self, action: #selector(getData), forControlEvents: .ValueChanged) 

     //Do something to refreshControl.rx_refreshing? 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 
     let str = data[indexPath.row] 
     cell.textLabel?.text = str 
     return cell 
    } 

    //MARK: - Requests 

    private func getData() { 
     let myData = MyAPI.getData() //Returns Observable<[String]> 
     myData 
      .subscribe({ [weak self] (event) in 
       switch event { 
       case .Next(let strings): 
        self?.data = strings 
        self?.tableView.reloadData() 
        break 
       case .Error(let err): 
        print(err) 
        break 
       case .Completed: 
        break 
       } 
       // self?.refreshControl?.endRefreshing() 
       }) 
      .addDisposableTo(db) 
    } 
} 

MyAPI bazı dize değerleri için bir istek gönderir: Mesela

, ben bir API bazı dizeleri yükleme am demek veya ağ talebi mi? refreshControl.rx_refreshing'a bağlanmam gerekiyor mu?

cevap

7

RxSwift'in örnek uygulaması, bu tür bir mantığı işlemek için ilginç bir sınıf sağlar: ActivityIndicator.

ActivityIndicator içeri girdikten sonra, rx_refreshing numaralı bağlantıyı bağlamak için kod gerçekten çok kolay hale gelir.

+0

Çok teşekkürler! Denediğimde, activityIndicator.asDriver() işlevini 'activityIndicator.asObservable()' olarak değiştirmem gerekiyordu, aksi takdirde "Sürücü Değeri öğesinin bindTo" öğesinin hiçbiri yoktur. Ayrıca, bir denetim olayını programlı olarak refreshControl'e nasıl uygulayabilirim? RefreshControl.beginRefreshing() 'ı denedim, ancak bu işe yaramıyor. – jacks205

+0

Etkinliği programlı olarak göndermek için ne yapmaya çalışıyorsunuz? "ViewDidLoad" yürütüldüğünde gerçekleştirilecek ilk 'getData()' yi kullanmak isterseniz, .flatMapLatest'den hemen önce .startWith() 'yi kullanarak daha iyi bir şekilde hizmet vermiş olursunuz. '.asObservable()' kullanmak için cevabı güncelledim. – tomahh

+0

Evet, demek istediğim buydu. Bu Rx eşyalarına hala yeni. Yardım için çok teşekkürler! – jacks205

İlgili konular