Выполните асинхронную выборку изображений в ячейках UitableView, которые загружаются как фоновый процесс: s - PullRequest
1 голос
/ 02 июля 2010

Я создаю приложение для iphone, теперь в этом приложении есть tabviewcontroller, а на одной из вкладок есть контроллер вида навигации.Внутри контроллера представления навигации у меня есть 2 контроллера UIview, и в одном я загружаю UITableView.Данные для ячеек загружаются из базы данных, и это занимает некоторое время, чтобы избежать этого, я делаю

[self performSelectorInBackground:@selector(loadTableData) withObject:nil];

, который загружает все данные в фоновом потоке.И вставляет Uitableview как подпредставление.Теперь ячейки в этой таблице извлекают изображения из определенных источников url (упомянутых в БД), и я асинхронно извлекаю эти изображения, используя метод, с которым я столкнулся в Интернете по адресу

http://www.markj.net/iphone-asynchronous-table-image/

Реализуя

(void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData

И

(void)connectionDidFinishLoading:(NSURLConnection*)theConnection

В подклассе UIView.который загружает изображения и помещает его в UIImageView.Все это происходит внутри

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

in После того, как метод connectionDidFinishLoading является жестким, это то, что должно произойти

    -(void)connectionDidFinishLoading:(NSURLConnection*)theConnection{
[connection release];
connection=nil;
if ([[self subviews] count]>0) {
    //then this must be another image, the old one is still in subviews
    [[[self subviews] objectAtIndex:0] removeFromSuperview]; //so remove it (releases it also)
}

//make an image view for the image
UIImageView* imageView = [[[UIImageView alloc] initWithImage:[UIImage imageWithData:data]] autorelease];
//make sizing choices based on your needs, experiment with these. maybe not all the calls below are needed.
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.autoresizingMask = ( UIViewAutoresizingFlexibleWidth || UIViewAutoresizingFlexibleHeight );
for(UIView *view in self.subviews){ //****i do this to remove a UIActivityIndicatorView which is placed until the image is completely fetched 
        [view removeFromSuperview];
}
[self addSubview:imageView];
imageView.frame = self.bounds;
[imageView setNeedsLayout];
[self setNeedsLayout];
[data release]; //don't need this any more, its in the UIImageView now
data=nil;}

это работает нормально, если я не загружаю UItableView в фоновом режиме.то есть когда я не делаю

[self performSelectorInBackground:@selector(loadTableData) withObject:nil];

Но когда я загружаю таблицу в фоновом режиме, методы connection: didReceiveData: и connectionDidFinishLoading: никогда не вызываются.Но он начинает работать должным образом, когда я прокручиваю вниз несколько ячеек.

Надеюсь, я все правильно объяснил здесь.Я полностью запутался в этом.Извините за грязный код.Я супер нуб в этом.

1 Ответ

0 голосов
/ 02 июля 2010

Эй, у меня нет ответа на вашу проблему, так как я в той же лодке. Я задал похожий вопрос вчера Создание одного объекта JSON Parser / Network

Falconcreek предоставил мне несколько ссылок, не уверен, что они вам пригодятся, но они могут помочь объяснить некоторые ваши проблемы.

Я также начал использовать ASIHTTPRequest (http://allseeing -i.com / ASIHTTPRequest / ) для получения данных. Более конкретно, посмотрите, как демонстрируется использование очереди. В основном создайте очередь запросов, когда очередь пуста, а затем запустите следующий метод.

Удачи, приятель!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...