Обновите iPhone UIProgressView во время загрузки NSURLConnection - PullRequest
3 голосов
/ 26 марта 2010

Я использую этот код:

NSURLConnection *oConnection=[[NSURLConnection alloc] initWithRequest:oRequest delegate:self];

, чтобы загрузить файл, и я хочу обновить индикатор выполнения для загруженного подпредставления. Для этого я использую этот код:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [oReceivedData appendData:data];
 float n = oReceivedData.length;
 float d = self.iTotalSize;
 NSNumber *oNum = [NSNumber numberWithFloat:n/d];
 self.oDPVC.oProgress.progress = [oNum floatValue];
}

Подвид - oDPVC, а индикатор выполнения - oProgress. Установка свойства progress не обновляет элемент управления.

Из того, что я прочитал в Интернете, многие люди хотят это сделать, но пока нет полного, надежного образца. Также есть много противоречивых советов. Некоторые люди думают, что вам не нужна отдельная тема. Некоторые говорят, что вам нужен фоновый поток для обновления прогресса. Некоторые говорят «нет», делают другие вещи в фоновом режиме и обновляют прогресс в главном потоке.

Я испробовал все советы, и ни один из них мне не помог.

Еще одна вещь, может быть, это ключ. Я использую этот код для загрузки подпредставления во время applicationDidFinishLaunching:

self.oDPVC = [[DownloadProgressViewController alloc] initWithNibName:@"DownloadProgressViewController" bundle:nil];
[window addSubview:self.oDPVC.view];

В файле XIB (который я рассмотрел как в Интерфейсном Разработчике, так и в текстовом редакторе) индикатор выполнения имеет ширину 280 пикселей. Но когда открывается вид, он как-то настраивается на половину этой ширины. Также фоновым изображением представления является default.png. Вместо того, чтобы отображаться прямо поверх изображения по умолчанию, оно растягивается примерно на 10 пикселей, оставляя белую полосу в нижней части экрана.

Может быть, это отдельная проблема, а может и нет.

1 Ответ

3 голосов
/ 26 марта 2010
self.oDPVC.oProgress.progress = [oNum floatValue];

Установка свойства прогресса не обновить элемент управления.

Какое значение self.oDPVC (это nil)?

Какое значение self.oDPVC.oProgress (это nil)?

Пара других моментов.

Во-первых:

self.oDPVC = [[DownloadProgressViewController alloc] initWithNibName:@"DownloadProgressViewController"bundle:nil];

Как определяется ваш oDPVC @property? Если он использует retain, эта строка может (будет) приводить к утечке памяти (она будет удваиваться retain). Вы должны использовать этот шаблон вместо:

DownloadProgressViewController* dpvc = [[DownloadProgressViewController alloc] initWithNibName:@"DownloadProgressViewController" bundle:nil];
self.oDPVC = dpvc;
[dpvc release];

Второе:

float n = oReceivedData.length;
float d = self.iTotalSize;
NSNumber *oNum = [NSNumber numberWithFloat:n/d];
self.oDPVC.oProgress.progress = [oNum floatValue];

Свойство progress само по себе является плавающей точкой. Вам на самом деле не нужно использовать NSNumber объект. Вы также можете рассмотреть возможность добавления единицы к знаменателю, чтобы избежать деления на ноль:

float n = oReceivedData.length;
float d = self.iTotalSize;
float percentCompleted = n/(d + 1.0f);
self.oDPVC.oProgress.progress = percentCompleted;
...