Задержанный рендеринг UIImageView в UITableView

Использование типа файла ASHX:
, Если Вы хотите просто произвести некоторый основной HTML или xml, не проходя обработчики событий страницы затем, можно реализовать HttpModule простым способом

Имя страница как SomeHandlerPage.ashx и просто поместить ниже кода (всего одна строка) в нем

<%@ webhandler language="C#" class="MyNamespace.MyHandler" %>

Затем файл кода

using System;
using System.IO;
using System.Web;

namespace MyNamespace
{
    public class MyHandler: IHttpHandler
    {
        public void ProcessRequest (HttpContext context)
        {   
            context.Response.ContentType = "text/xml";
            string myString = SomeLibrary.SomeClass.SomeMethod();
            context.Response.Write(myString);
        }

        public bool IsReusable
        {
            get { return true; }
        }
    }
}
27
задан Brad 1 December 2009 в 16:20
поделиться

4 ответа

Причина, по которой сообщения делегата соединения не обрабатываются до тех пор, пока вы не прекратите прокрутку, заключается в том, что во время прокрутки цикл выполняется в UITrackingRunLoopMode. По умолчанию NSURLConnection планирует себя только в NSDefaultRunLoopMode, так что вы не получите никаких сообщений во время прокрутки.

Вот как запланировать соединение в "общих" режимах, которые включают UITrackingRunLoopMode:

NSURLRequest *request = ...
NSURLConnection *connection = [[NSURLConnection alloc]
                               initWithRequest:request
                               delegate:self
                               startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop]
            forMode:NSRunLoopCommonModes];
[connection start];

Обратите внимание, что в инициализаторе необходимо указать startImmediately:NO, что, похоже, противоречит документации Apple, которая предполагает, что вы можете изменить режимы цикла даже после его запуска.

.
65
ответ дан 28 November 2019 в 04:37
поделиться

Вы должны прочитать о NSRunLoop. Я подозреваю, что во время прокрутки цикл выполнения выполняется в NSEventTrackingRunLoopMode, а NSURLConnection не включен в этот режим. Вы, вероятно, могли бы обойти это, вызвав NSURLConnection scheduleInRunLoop: forMode :, чтобы загрузка могла происходить во время прокрутки.

Это, вероятно, повлияет на производительность прокрутки, которая, вероятно, является причиной отдельного режима цикла выполнения в первую очередь. Но попробуйте и посмотрите, каково это!

1
ответ дан 28 November 2019 в 04:37
поделиться

Во-первых ... ваше соединение, вероятно, даже не запускается, пока не дойдет до mainRunLoop, и там также обрабатывается анимация прокрутки.

Я столкнулся с той же проблемой и исправил он сообщает соединениям для изображений, чтобы они запускались немедленно после создания.

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:wrapper.request delegate:wrapper];

    [connection start];

В подпрограмме завершения, когда вы получаете изображение и устанавливаете cell.imageView.image на полученное изображение, вы должны проверить, принадлежит ли эта ячейка одному из ячеек, отображаемых в настоящее время в таблице ... и если это так, вызовите [tableView reloadData].

    NSInteger itemIndex = theIndexInTheRowDataOfTheCellYouStuffedTheImage

    NSArray *indicies = [_tableView indexPathsForVisibleRows];
    NSUInteger rows = indicies.count;

    if (rows > 0 &&
        itemIndex >= ((NSIndexPath *)[indicies objectAtIndex:0]).row &&
        itemIndex <= ((NSIndexPath *)[indicies objectAtIndex:rows - 1]).row)
    {       
        [_tableView reloadData];
    }
0
ответ дан 28 November 2019 в 04:37
поделиться

Если вы заключите загрузку и обновление изображения в NSOperation, обновления будут происходить в виде таблицы -view scrolls.

Еще одно преимущество NSOperation в том, что вы можете отменить операцию, когда ячейка скользит за пределы экрана. Он будет намного более отзывчивым к пользователю ... особенно, если он быстро прокручивает длинный список.

1
ответ дан 28 November 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: