Как я могу приостановить свое приложение достаточно долго, чтобы мой экран "догонял" - PullRequest
1 голос
/ 29 июля 2011

Я делаю синхронный веб-запрос, и я хотел бы показать прогресс, но что еще более важно, как только я нажму «Пуск», он отключается от гонок, игнорируя такие вещи, как включение счетчика NetworkActivty или изменение меток,

Я понимаю, что индикаторы выполнения, возможно, должны подождать, пока у меня не будет времени написать асинхронно выборки, но могу ли я заставить программу ждать, пока метки не изменятся?Или хотя бы способ подделать его?

На TouchUpInside на UIButton у меня есть.,,

-(IBAction)startButtonPressed

{[UIApplication sharedApplication] .networkActivityIndicatorVisible = YES;

NSString *lastUpdate = [[self getLastUpdateDate] stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
startButton.enabled = NO;
cancelButton.enabled = NO;
resetSwitch.enabled = NO;
cleanSwitch.enabled = NO;
//check the # of customer updates and update accordingly

statusLabel.text = @"Updating Customers. . .";
//[self performSelector:(@selector(updateProgress:withStatus:)) withObject:0.0f withObject:@"Updating Customers. . . " afterDelay:500];
//[self performSelector:(@selector(updateProgressIndicators)) withObject:nil afterDelay:0];

if (clean) {
    [self deleteALL];
}

if ([self customersCount] < 1000 && !reset)
    [self addCustomers:lastUpdate];
else
    [self addCustomers:nil];

//check the # of product updates and update accordingly, reset does not affect products
statusLabel.text = @"Updating Products. . .";

if ([self productsCount] < 25000 || !clean)
    [self addProducts:lastUpdate];
else
    [self addProducts:nil];

//check the # of vendor updates and update accordingly, reset does not affect vendors
statusLabel.text = @"Updating Vendors. . . ";
if ([self vendorsCount] < 1000 || !clean || [[self fetchVendor:@"0002"] count] == 0) {
    [self addVendors:lastUpdate];
}else{
    [self addVendors:nil];
}

statusLabel.text = @"Updating History. . . ";
[self getHistory];



statusLabel.text = @"Updating Custom Pricing. . . ";
if ([self customPricesCount] < 500 && !reset) {
    [self addCustomPrices:lastUpdate];
}else{
    [self addCustomPrices:nil];
}

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM-dd-yyyy HH:mm:ss"];
[self setLastUpdateDate:[dateFormatter stringFromDate:[NSDate date]]];  
[dateFormatter release];

statusLabel.text = @"Done!";
cancelButton.enabled = YES;
cancelButton.tag = 1;
cancelButton.titleLabel.text = @"Close";
startButton.enabled = NO;

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

1 Ответ

2 голосов
/ 29 июля 2011

Одна из ваших возможностей - планирование сетевого запроса на выполнение в главном потоке.Это позволит обновлять пользовательский интерфейс перед отправкой сетевого запроса.

Чтобы сделать это, вы должны разделить код на два метода:

  1. Пользовательский интерфейсизменение (индикатор активности и т. д.) до синхронного сетевого запроса;

  2. синхронный сетевой запрос и обработка ответа (с обновлением пользовательского интерфейса);

* 1014Скажем, что 2. реализован методом, называемым offToTheRaces, вы запланируете этот метод из первого:
[self performSelector:@selector(offToTheRaces) withObject:nil afterDelay:0];

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

...