Использование типа файла 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; }
}
}
}
Причина, по которой сообщения делегата соединения не обрабатываются до тех пор, пока вы не прекратите прокрутку, заключается в том, что во время прокрутки цикл выполняется в 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, которая предполагает, что вы можете изменить режимы цикла даже после его запуска.
Вы должны прочитать о NSRunLoop. Я подозреваю, что во время прокрутки цикл выполнения выполняется в NSEventTrackingRunLoopMode, а NSURLConnection не включен в этот режим. Вы, вероятно, могли бы обойти это, вызвав NSURLConnection scheduleInRunLoop: forMode :, чтобы загрузка могла происходить во время прокрутки.
Это, вероятно, повлияет на производительность прокрутки, которая, вероятно, является причиной отдельного режима цикла выполнения в первую очередь. Но попробуйте и посмотрите, каково это!
Во-первых ... ваше соединение, вероятно, даже не запускается, пока не дойдет до 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];
}
Если вы заключите загрузку и обновление изображения в NSOperation, обновления будут происходить в виде таблицы -view scrolls.
Еще одно преимущество NSOperation в том, что вы можете отменить операцию, когда ячейка скользит за пределы экрана. Он будет намного более отзывчивым к пользователю ... особенно, если он быстро прокручивает длинный список.