ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 2

APIDownload

На сайте есть хороший пример Закачка данных. Он отлично скачивает данны, не блокируя интерфейс. Но его проблемма в том, что весь код, отвечающий за работу с Интернет находится в контроллере представления. Это неудобно по той причине, что нам может понадобиться скачивать данные в других контроллерах, а дублировать тот же код будет не корректно. Для исправления ситуации я написал отдельный класс, с помощью которого можно легко скачивать любые данные с сети. В этом примере я покажу как ним пользоваться.

 

В первую очередь создадим новый проект на основе представления (View-based Application) и назовем его Download. Теперь добавим в проект класс APIDownload и изменим класс DownloadViewController.

 

DownloadViewController.h

<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;
#import "APIDownload.h"

@interface DownloadViewController : UIViewController {
    UIImageView *logo;
    UIProgressView *downloadProgress;
}

@property (nonatomic, retain) IBOutlet UIImageView *logo;
@property (nonatomic, retain) IBOutlet UIProgressView *downloadProgress;

@end</code>

 

Как видно с кода, в первую очередь я импортировал только что добавленный класс APIDownload. Затем я добавил два объекта: logo (сюда мы будем вставлять картинку) и downloadProgress (для отображения процесса загрузки). То есть, я решил не нагружать вас новыми объектами. Фактически этот пример является миксом примеров Закачка данных и UIProgressView.

 

DownloadViewController.m

<code data-result="[object Object]">#import "DownloadViewController.h"

@implementation DownloadViewController

@synthesize logo;
@synthesize downloadProgress;

- (void)dealloc {
    self.logo = nil;
    self.downloadProgress = nil;
    [super dealloc];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.logo = nil;
    self.downloadProgress = nil;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    [APIDownload downloadWithURL:@"http://mycrealife.ru/wp-content/uploads/2014/01/logo1.png" delegate:self];
}

- (void)APIDownload:(APIDownload*)request {    
    downloadProgress.hidden = YES;

    UIImage *image = [UIImage imageWithData:request.downloadData];
    logo.image = image;
}

- (void)dataDownloadAtPercent:(NSNumber*)percent {
    downloadProgress.progress = [percent floatValue];
}

@end</code>

 

В первую очередь я синтезировал методы доступа для объектов интерфейса и оганизовал очистку памяти для них. Затем, в методе viewDidLoad стартую закачку с помощью метода downloadWithURL класса APIDownload. Для этого я передаю в метод два параметра. Ссылку в виде строки и объект, которому будут посылаться сообщения о состоянии скачивания и об окончании процесса закачки. Метод dataDownloadAtPercent возвращает значение на сколько процентов загружены данные. Это значение я и устанавливаю объекту downloadProgress. Метод APIDownload выззывается по окончанию процесса загрузки. В нем я скрываю downloadProgress, конвертирую полученные данные в изображение и устанавливаю изображение объекту logo.

 

Осталось лишь связать объекты downloadProgress и logo с интерфейсом в файле DownloadViewController.xib. Как это делать было не однократно описано в разных уроках на сайте. В крайнем случае можете воспользоваться примерами Закачка данных и UIProgressView.

 

Если процесс загрузки происходит слишком быстро — вы можете изменить ссылку на файл картинки (подсунуть ему большое изображение, к примеру вот такое: http://mycrealife.ru/wp-content/uploads/2014/01/iceHD_hires3.jpg).

 

Исходный код этого проекта можно скачать здесь. И отдельно сам класс APIDownload.