Получить уведомление после загрузки? - PullRequest
0 голосов
/ 21 марта 2009

imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: srcAddres]];

Загрузка jpeg в мои изображения займет некоторое время, например: 2 секунды, поэтому я хочу показывать индикатор активности до завершения загрузки. Как я могу узнать, когда загрузка закончилась?

Ответы [ 3 ]

1 голос
/ 21 марта 2009

Вместо этого вам нужно будет использовать асинхронную систему загрузки URL (NSURLConnection в iPhone SDK). Вот документация Apple:

http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html

0 голосов
/ 23 марта 2009

Вам нужно то, что называется «селектором».

Я бы по-прежнему рекомендовал использовать синхронные вызовы - но в отдельном потоке. Причина этого заключается в том, что, несмотря на асинхронность, если вы передаете данные в текущем потоке, вы все равно будете испытывать проблемы с медлительностью пользовательского интерфейса. Если вы используете глобальный индикатор сетевой активности, это не проблема - но индикатор, локальный для вашего приложения (или любых других перерисовок экрана) - будет казаться заблокированным.

Поэтому создайте класс с именем ImageDownloader (или что-то подобное) и поместите туда свой синхронный вызов загрузки, чтобы получить данные изображения. Как один из членов вашего класса, объявите (в интерфейсе):

SEL successSelector;

Когда вы создаете этот класс (скажем, вы хотите передать URL-адрес и получить обратно данные изображения, создайте функцию инициализации следующей формы (которая принимает значение SEL) и вызовите ее, используя:

[ImageDownloader alloc] initWithSelector: @"http://url string" :self : @selector(yourFunction:)

]

По сути, вам нужно передать объект и метод в этом объекте для обратного вызова, когда все будет сделано.

Реализация initWithSelector выглядит следующим образом:

-(id) initWithSelector: (NSString*)url :(id)adelegate :(SEL) successSeletor {
     self.url = url;
     self.delegate = adelegate;
     self.sel = successSelector;
}

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

Итак, сигнал для вашей функции выглядит так:

-(void) yourFunction: (NSData*)imageData;

Чтобы вызвать это из вашего класса ImageDownloader (когда загрузка будет завершена), просто вызовите ваш селектор, используя:

[delegate performSelector:sel withObject:imageData];

Наслаждайтесь!

0 голосов
/ 21 марта 2009

Предполагая, что эта работа выполняется в контроллере, используйте NSURLConnection в качестве Грэма Ли, как предложено, и установите self (контроллер) в качестве делегата для этого объекта.

Затем вы объявляете следующий метод в вашем контроллере ( см. Эту ссылку для получения дополнительной информации ):

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

Когда загрузка будет завершена, ваш делегат будет вызван. Кстати, для показа индикатора сетевой активности вы можете использовать такой код:

UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES; // to stop it, set this to NO

Опять же, различные делегаты помогут вам здесь.

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