Обновление UIImageView внутри UIScrollView - изображение останавливается при прокрутке - PullRequest
2 голосов
/ 06 марта 2012

У меня есть UIImageView внутри UIScrollView.UIImageView отображает изображение, которое постоянно загружается из Интернета (поток открывается с помощью NSURLConnection).

NSString surl = @"some valid url";
NSURL* nsurl = [NSURL URLWithString:surl];
NSURLRequest *request = [NSURLRequest requestWithURL:nsurl];
[[NSURLConnection alloc] initWithRequest:request delegate:self];

// this method will be called when every chunk of data is received
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // here I collect data and when i have enough
    // data to create UIImage i create one
}

Каждый раз, когда я получаю данные, я упаковываю их в NSData, а когда я получаю целое изображение, я создаю UIImage из этого NSData.а затем я установил это изображение как изображение UIImageView.Все работает нормально, изображения обновляются как следует, но когда я касаюсь экрана и начинаю перемещать содержимое (этот UIImageView всегда больше экрана, а UIScrollView всегда помещается на весь экран) обновления изображения прекращаются, и я вижу только последний кадр, который отображался на экране.раз я нажал.Кажется, это происходит потому, что мой

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

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

Ответы [ 2 ]

4 голосов
/ 07 марта 2012

Документация для -[NSURLConnection initWithRequest:didReceiveData:] гласит:

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

Я предполагаю, что вы создаете NSURLConnection в главном потоке.

Когда UIScrollView отслеживает касание, он запускает цикл выполнения в другом режиме, а не в режиме по умолчанию. Вот почему вы перестаете получать обновления, пока вы касаетесь вида прокрутки. (Это также приводит к тому, что NSTimer s прекращает стрельбу, когда вы касаетесь вида прокрутки.)

Я думаю, вы можете настроить NSURLConnection для работы как в режиме по умолчанию, так и в режиме отслеживания прокрутки, например:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
    delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode: NSRunLoopCommonModes];
[connection start];
0 голосов
/ 07 марта 2012

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

...