2011-07-28 31 views
1

我正在做同步Web請求,並且我想顯示進度,但更重要的是,只要點擊「開始」關閉比賽類似於打開NetworkActivty微調器或更改標籤。如何暫停我的應用程序足夠長的時間以使屏幕「趕上」

我意識到進度條可能要等到我有時間來異步寫入提取,但是我可以讓程序等到標籤發生變化?或者至少有一種方法來僞造它?

在TouchUpInside上我有一個UIButton。 。 。

-(IBAction)startButtonPressed 

{ [UIApplication的sharedApplication] .networkActivityIndi​​catorVisible = 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; 
} 

回答

2

您擁有的一種可能性是調度網絡請求以在主線程上執行。這將允許UI在網絡請求發出之前得到更新。

在ordert這樣做,你應該在兩種方法分割你的代碼:

  1. UI變化(活動指示燈等)到同步網絡請求;

  2. 同步網絡請求和響應處理(帶UI更新);

都說2.由名爲offToTheRaces方法來實現,你會安排從第一個這種方法:

[self performSelector:@selector(offToTheRaces) withObject:nil afterDelay:0]; 

通知,你沒有做任何形式的多線程這樣的,也不你在推遲一段時間嗎?只需在主循環再次執行時安排要執行的方法,這將使用戶界面有機會得到更新。

+0

太棒了!你是塞爾吉奧,是個紳士和學者!完善! –

+0

你太客氣了,謝謝。很高興有幫助。 – sergio

相關問題