Перенести следующий набор изображений в RestSharp

#c# #ios #xamarin.ios #xamarin #restsharp

#c# #iOS #xamarin.ios #xamarin #restsharp

Вопрос:

Я пытаюсь создать бесконечную таблицу в Xamarin в качестве клиента Instagram. Однако, когда я прокручиваю до нижней части экрана, он загружает ту же 2-ю страницу изображений обратно. Он загружает первую страницу нормально, затем загружает 2-ю страницу нормально, однако, когда я пытаюсь загрузить 3-ю страницу, она снова загружает 2-ю страницу. Как бы мне это исправить? Вот как я пытаюсь его загрузить:

 Account instagram = enumerable.First ();
var instagramAccessToken = instagram.Properties ["access_token"].ToString ();

var request = new RestRequest { RootElement = "data", Resource = "/users/self/feed" };
request.AddParameter ("access_token", instagramAccessToken);

var client = new RestClient ("https://api.instagram.com/v1");
client.ExecuteAsync (request, response => {
    var rootObject = JsonConvert.DeserializeObject<RootObject> (response.Content);

    string nextURL = rootObject.pagination.next_url;
    //// Create Next Client
    var requestBack = new RestRequest ();
    var clientBack = new RestClient (nextURL);

    // GET Next Response
    clientBack.ExecuteAsync (requestBack, responseBack => {
        var rootObjectBack = JsonConvert.DeserializeObject<RootObject> (responseBack.Content);
        table.InvokeOnMainThread (() => {
            // Create list that contains newly attained JSON
            List<Datum> instagramData = rootObjectBack.data;
            // Create dummy list for other values
            List<Datum> sloppy = null;
            ((TableSource<Datum>)table.Source).instaData.AddRange (instagramData);
            table.ReloadData ();
            });
        });
    });
 

Здесь я обнаруживаю, что пользователь находится в нижней части таблицы

 public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
    {

        NetworkCheck netCheck = new NetworkCheck ();
        netCheck.runCheck ();
        bool log = netCheck.anyLoggedIn ();

        if (tableView.ContentSize.Height - UIScreen.MainScreen.Bounds.Height <= tableView.ContentOffset.Y) {
            // this is the last row in the last section
            Console.WriteLine ("~~~Bottom~~~");
            FLDTRequest fldt = new FLDTRequest ();
            fldt.getPastInstagramFeed (tableView);
        }
        var cell = tableView.DequeueReusableCell(InstagramCell.Key) as InstagramCell;

        if (cell == null)
        {
            cell = new InstagramCell();
            var views = NSBundle.MainBundle.LoadNib("InstagramCell", cell, null);
            cell = Runtime.GetNSObject(views.ValueAt(0)) as InstagramCell;
        }

        Datum h = instaData [indexPath.Row];
        cell.BindData(h);

        return cell;
    }
 

Комментарии:

1. Я не вижу никакого кода для загрузки третьей страницы. Кажется, вы загружаете одну страницу, затем используете nextURL для получения следующей страницы, но я не вижу, чтобы вы выполняли третий вызов, используя значение nextURL для 2-й страницы

2. О, я вижу, не могли бы вы помочь мне создать функцию, которая загружала бы 3-ю страницу и так далее. Ваша помощь была бы очень признательна.

3. похоже, что все, начиная с комментария «создать нового клиента» до конца, — это, по сути, то, что вам нужно для получения «следующего» набора данных, вам просто нужно каждый раз передавать новый «nextUrl»

4. @Jason не могли бы вы помочь мне отредактировать мой метод для этого?

Ответ №1:

Поместите обратный вызов в отдельную рекурсивную функцию, которая продолжает вызывать себя до тех пор, пока существует nexturl . Не знаю API instagram, но что-то вроде этого должно работать.

Запустите это в viewdidload или что-то в этом роде (НЕ каждый раз, когда вы достигаете дна, но один раз)

 nextUrl = null;

Account instagram = enumerable.First ();
var instagramAccessToken = instagram.Properties ["access_token"].ToString ();

var request = new RestRequest { RootElement = "data", Resource = "/users/self/feed" };
request.AddParameter ("access_token", instagramAccessToken);

var client = new RestClient ("https://api.instagram.com/v1");
client.ExecuteAsync (request, resp =>
    {
        PageRetrievedCallback(resp );
    });
 

Функция обратного вызова

сохранить nextUrl как значение класса

 string nextUrl = null;

public void PageRetrievedCallback(RestResponse response)
{
    var rootObject = JsonConvert.DeserializeObject<RootObject> (response.Content);
    nextURL = rootObject.pagination.next_url;

    table.InvokeOnMainThread (() => {
            // Create list that contains newly attained JSON
            List<Datum> instagramData = rootObject.data;
            // Create dummy list for other values
            List<Datum> sloppy = null;
            ((TableSource<Datum>)table.Source).instaData.AddRange (instagramData);
            table.ReloadData ();
         });
}
 

запустите это, когда обнаружите дно, чтобы загрузить следующую страницу:

 if ( ! string.IsNullOrEmpty (nextURL) ) 
{

    var requestBack = new RestRequest ();
    var clientBack = new RestClient (nextURL);
    clientBack.ExecuteAsync (requestBack, resp =>
    {
        PageRetrievedCallback(resp );
    });
}
 

Комментарии:

1. Когда я вызываю функцию из верхнего кода, client.ExecuteAsync (request, PageRetrievedCallback); она выдает мне сообщение об ошибке, в котором говорится, что мне нужно указать параметр для RestResponse response параметра PageRetrievedCallback(RestResponse response)

2. он показывает все сообщения, но когда я снова прокручиваю вниз, он снова показывает последнее сообщение

3. При перетаскивании в нижнюю часть экрана до конца в нижней части табличного представления запускается код

4. Я отредактировал свой вопрос, чтобы включить функцию, которую я использую для вызова функции nextPage

5. Вы загружали полную ленту каждый раз, когда достигали дна. Поэтому, конечно, первый появится снова. Я снова обновил свой ответ. пожалуйста, внимательно прочитайте