2017-08-24 22 views
0

このiOSアプリケーション用のフィードを作成するAPIのLaravel Routeがあります。テーブルから投稿を選択してページ内の投稿を分割することで動作しますこのように、記事をダウンロードするには、ページ番号を送信します。Laravel JSONフィード内の投稿のページ番号を取得

public function feed(){ 

    $user = JWTAuth::parseToken()->authenticate(); 

    if (request()->has('page') && $user != null) { 

     $pagesize = 20; 

     $query = Posts::join('clase_user', function ($join) { 

      $user = JWTAuth::parseToken()->authenticate(); 

      $join->on('clase_user.clase_id', '=', 'posts.clase_id') 
       ->where('clase_user.user_id', '=', $user->id); 
     }) 
      ->with('user') 
      ->skip(((int)request()->get('page') - 1) * $pagesize) 
      ->take($pagesize)->get(); 

     return $query; 
    }else{ 
     return response()->json(['error' => 'Pagina no especificada'], 500); 
    } 

} 

すべてが素晴らしい作品が、問題は、私のiOSのコードは、モミのページをダウンロードするために、いくつかのポストが途中で失われる20件の以上の新しい投稿があったときであります、あなたが1,2,3のようにページ数を続けるので、あなたが下にスクロールするとうまくいきます...しかし、もし私が20以上の新しい投稿があれば、私はそれらが失われると更新すると言ったように。

ポスト(スウィフト3)をダウンロードする

私のiOSのコードは:

func dwonloadPosts(page: Int!){ 

     let http = "\(Base_URL)\(feed_url)?token=\(userToken.getToken())&page=\(page)" 

     self.pyroFire.Download(mod: HTTPMethod.get, URL: http) { 

      if let posts = self.pyroFire.getResult()["posts"] as? [Dictionary<String, AnyObject>]{ 

       var new = true 

       for post in posts{ 

        if let id = post["id"] as? Int!{ 

         var idRow = 0 

         for oldPost in self.Posts{ 

          if(oldPost.id == id){ 

           new = false 

           if let text = post["text"] as? String!{ 
            self.Posts[idRow].text = text 
           } 

           if let archivo = post["archivo"] as? String!{ 
            self.Posts[idRow].archivo = archivo 
           } 

           if let updated_at = post["updated_at"] as? String!{ 
            self.Posts[idRow].updated_at = updated_at 
           } 
          } 

          idRow += 1 
         } 

         if(new){ 

          var NewPost = Post() 

          NewPost.id = id 

          if let user_id = post["user_id"] as? Int!{ 
           NewPost.user.id = user_id 
          } 
          if let clase_id = post["clase_id"] as? Int!{ 
           NewPost.clase_id = clase_id 
          } 
          if let text = post["text"] as? String!{ 
           NewPost.text = text 
          } 
          if let archivo = post["archivo"] as? String!{ 
           NewPost.archivo = archivo 
          } 
          if let created_at = post["created_at"] as? String!{ 
           NewPost.created_at = created_at 
          } 
          if let updated_at = post["updated_at"] as? String!{ 
           NewPost.updated_at = updated_at 
          } 


          if let user = post["user"] as? Dictionary<String, AnyObject>{ 

           if let name = user["name"] as? String!{ 
            NewPost.user.name = name 
           } 
           if let about = user["about"] as? String!{ 
            NewPost.user.about = about 
           } 
           if let text = user["handler"] as? String!{ 
            NewPost.user.handler = text 
           } 
           if let archivo = user["pp"] as? String!{ 
            NewPost.user.pp = archivo 
           } 
           if let created_at = user["email"] as? String!{ 
            NewPost.user.email = created_at 
           } 
           if let updated_at = user["created_at"] as? String!{ 
            NewPost.user.created_at = updated_at 
           } 
          } 

          self.Posts.append(NewPost) 

         } 

        } 

       } 
      } 
     } 
     self.collectionV.reloadData() 
    } 

私の質問は、ポストのIDを送信する方法を見つけると、その後のポストは、私は更新できる属するページ番号を取得することです成功しました。

あなたがより良いフィードを作成するためのより良い方法をお持ちの場合は、アイデアを投稿するために開いてください。

答えて

0

"ページ番号"の代わりにoffsetを送信してください。 "pageSize"をharcodingせずにデータベースから結果を取得するときに、その数の行をスキップできます。ページングには複数のアプローチがあり、実際にはアプリケーション/データによってかなり複雑になる可能性があります。

dwonloadPosts(page:)メソッドが非同期の場合、self.collectionV.reloadData()for-inの後になり、ネットワークコールの外にはなりません。それ以外の場合、collectionViewは、新しいデータのすべてまたは少なくとも一部が追加される前に再ロードされます。

func dwonloadPosts(page: Int!) { 

    let http = "\(Base_URL)\(feed_url)?token=\(userToken.getToken())&page=\(page)" 

    self.pyroFire.Download(mod: HTTPMethod.get, URL: http) { 

     guard let posts = self.pyroFire.getResult()["posts"] as? [Dictionary<String, AnyObject>] 
      else { return } 

     var new = true 

     for post in posts { 
      ... 
     } 

     DispatchQueue.main.async { 
      self.collectionV.reloadData() 
     } 
    } 

} 


注:

+0

を、これは私をたくさん助けたそんなにありがとう! !! –

+0

この場合のオフセットは、累積結果カウントを意味します。例:20行を入力した場合、オフセットは最初は20になります。次のページでは、20 * pageNumberになります。 twitterがページを管理する方法の概要は次のとおりです。https://dev.twitter.com/rest/public/timelines – nathan

+0

ページング戦略に興味がある場合は、オンラインで検索します(例:オフセット/スキップ、ページトークン)。 https://softwareengineering.stackexchange.com – nathan

関連する問題