2017-03-05 12 views
1

UITableViewの一番下までスクロールすると、アプリケーションは配列に新しいコンテンツを追加するだけの関数( "CallAlamo(url:nextSearchURL)") tableView.reloadData()を呼び出すと、より多くのコンテンツでtableviewが更新されます。ただし、このプロセス中、tableViewは約2〜3秒間完全にフリーズします。ほとんどのテーブルビューは、新しいコンテンツがロードされているユーザーが自由にテーブルビューを移動できる他のアプリで行うように、フリーズして動作させないようにするにはどうすればよいですか。下にスクロールして新しい行を追加すると、UITableViewがフリーズする

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    let lastElement = posts.count - 1 
    if indexPath.row == lastElement { 

     callAlamo(url: nextSearchURL) //appends new content to array 
     tableView.reloadData() 

    } 
} 

UPDATE

これはcallAlamoが何をするかです:

func callAlamo(url : String){ 
    Alamofire.request(url).responseJSON(completionHandler: { 
    response in 

     self.parseData(JSONData: response.data!) 

    }) 
} 

func parseData(JSONData : Data){ 

    do{ 
     var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard 
     //print(readableJSON) 
     if let tracks = readableJSON["tracks"] as? JSONStandard{ 
      nextSearchURL = tracks["next"] as! String 
      if let items = tracks["items"] as? [JSONStandard]{ 
       //print(items) //Prints the JSON information from Spotify 
       for i in 0..<items.count{ 
        let item = items[i] 
        let name = item["name"] as! String 
        let previewURL = item["preview_url"] as! String 
        if let album = item["album"] as? JSONStandard{ 
         if let images = album["images"] as? [JSONStandard],let artist = album["artists"] as? [JSONStandard]{ 
          let imageData = images[0] //this changes the quality of the album image (0,1,2) 
          let mainImageURL = URL(string: imageData["url"] as! String) 
          let mainImageData = NSData(contentsOf: mainImageURL!) 

          let mainImage = UIImage(data: mainImageData as! Data) 

          let artistNames = artist[0] 
          let artistName = artistNames["name"] as! String 

          posts.append(post.init(mainImage: mainImage, name: name, artistName: artistName, previewURL: previewURL)) 
          self.tableView.reloadData() 
         } 
        } 
       } 
      } 
     } 
    } catch{ 
     print(error) 
    } 
} 

はUPDATE Anbu.Karthik選択肢2 @使用して2

質問1 : "imageData"は私の "mainImagedata"になりますか?

質問2:Alamofire.requestでエラーが発生しました。「余分な引数のメソッドが呼び出されました」というメッセージが表示され、削除すると「NSDataにサブスクリプトメンバがありません」というエラーメッセージが表示されます

+0

の必要はありませんを使用する必要があり、この 'tableView.reloadDataは()'あなたはcallAlamo 'のコードを表示することができます(u' –

+0

@ Anbu.Karthikはちょうどそれを更新しました。私はcallAlamoのtableView.reloadData()も呼び出すことがわかりましたが、tableView funcでtableView.reloadData()を取り出しました。それでもまだフリーズします – OriginalAlchemist

+1

確かに、あなたは 'を使用していますbzは、let mainImageURL = URL(string:imageData [" url "] as!文字列) let mainImageData = NSData(contentsOf:mainImageURL!) '、メインスレッドに影響します。 –

答えて

2

コードデザインが非常に悪いので、URLをセルに渡してフェッチと解析を実行し、メインキューでこれを実行する必要があります。これは、別のキューを使用してDispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).asyncを使用して行うことができます。 Alamofireがメインキューでクロージャを呼び出すのはIDKですが、その要求はそのように見えます。 DispatchQueue.main.async

UPDATE:reloadData()はあなたに無限ループを与えることが明らかになったと思いますが、これらを外部に呼び出す必要がありますTableViewDataSourceのつく

UPDATE 2:私はここでそれを見ることはありませんが、あなたはtableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)を使用して、それにlet cell = tableView.dequeueReusableCell.....

+0

私は、参照してください参照してください。レスポンスありがとう!私はちょっとセルにURLを渡し、「取り込みと解析をやりましょう」ということを少し混乱させました。あなたが言っていることをする方法のいくつかの例のコードを与えてもよろしいですか? – OriginalAlchemist

+0

セルのクラスを作成する必要があります –

+0

次の例は(もちろんセルのクラスにあります):https://imgur.com/a/dJcR7#sjUKOQ7 –

関連する問題