2010-11-25 50 views
1

我有一个方法执行连接来检索一些数据和popolate tableview。 这种方法效果很好。 现在我发动viewDidLoad中此方法iphone nsurlconnect,tableview和活动指标

[NSThread detachNewThreadSelector:@selector(connTre) 
toTarget:self 
withObject:nil];  

我创建这个其他功能:

- (void)initSpinner { 
av = [[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(195.0, 8.0, 30.0, 30.0) ] autorelease];  
av.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; 
[av hidesWhenStopped]; 
[self.view addSubview:av]; 
} 

(我initialite这viewDidLoad中)

- (void)spinBegin { 
    [av startAnimating]; 
} 

- (void)spinEnd { 
[av stopAnimating]; 
} 

在哪里开始和停止我的activityindicatorview更好的地方?

我尝试启动

[self performSelectorOnMainThread:@selector(spinBegin) 
withObject:nil 
waitUntilDone:false]; 

这里是我的表数据源非常标准代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
return [listaOggetti count]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
NSDictionary *dictionary = [listaOggetti objectAtIndex:section]; 
NSArray *array = [dictionary objectForKey:@"Elementi"]; 
return [array count]; 

} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
return 30; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView 
cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  
reuseIdentifier:CellIdentifier] autorelease]; 
    cell.selectionStyle = UITableViewCellStyleValue1 ; 
} 
NSInteger sectionRows = [tableView numberOfRowsInSection:[indexPath section]]; 
NSInteger row = [indexPath row]; 

// Configure the cell. 

NSDictionary *dictionary = [listaOggetti objectAtIndex:indexPath.section]; 
NSArray *array = [dictionary objectForKey:@"Elementi"]; 
NSString *cellValue = [array objectAtIndex:indexPath.row]; 

if (row == 0){ 
    cell.textLabel.text = cellValue; 
    cell.textAlignment = UITextAlignmentCenter; 
    cell.backgroundColor = [UIColor redColor]; 
    cell.font = [UIFont systemFontOfSize:13]; 
    cell.selectionStyle = UITableViewCellStyleValue1 ; 
} else { 


cell.textLabel.text = cellValue; 
cell.textAlignment = UITextAlignmentCenter; 
cell.backgroundColor = [UIColor whiteColor]; 
cell.selectionStyle = UITableViewCellStyleValue1 ; 
} 

return cell; 
} 

这是得到我的数据的方法:

- (void)connTre { 
NSThread *spinThread=[[NSThread alloc] initWithTarget:self 
selector:@selector(startSpinning) object:nil]; 
[spinThread start]; 

NSError *error; 
NSURLResponse *response; 
NSData *dataReply; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: @"myloginurl"]]; 

[request setHTTPMethod: @"GET"]; 
dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
//message tre soglie ok 
path = @"my_url_for_getting_data"; 
url = [NSURL URLWithString:path]; 
NSError *errors; 
htmlString = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:&errors]; 

NSString *regexString = @"(?:\r\n|[\n\v\f\r\302\205\\p{Zl}\\p{Zp}])"; 
NSString *reg2 [email protected]".+class=\"dettaglioSoglie.*"; 
NSString *reg3 [email protected]"</table>"; 
NSString*[email protected]"<td><b>(.+)&nbsp;</b></td><td>(.+)&nbsp;&nbsp;</td><td>(.+)&nbsp;&nbsp;</td><td>(.+)&nbsp;&nbsp;</td>"; 
NSString *replaceWithString = @"$1"; 
NSString *replaceWithString1 = @"Effettuato $2"; 
NSString *replaceWithString2 = @"Rimanente $3"; 
NSString *replaceWithString3 = @"Totale $4"; 
if(htmlString){ 
    NSArray *linesArray = [htmlString componentsSeparatedByRegex:regexString]; 
    for(NSString *lineString in linesArray) { 
     if(lineString ==[lineString stringByMatching:reg2]) { print = YES;} 
     if (print == YES) { 
      if(lineString ==[lineString stringByMatching:reg4]) { 
       replace = [lineString stringByReplacingOccurrencesOfRegex:reg4 withString:replaceWithString]; 
       replace1 = [lineString stringByReplacingOccurrencesOfRegex:reg4 withString:replaceWithString1]; 
       replace2 = [lineString stringByReplacingOccurrencesOfRegex:reg4 withString:replaceWithString2]; 
       replace3 = [lineString stringByReplacingOccurrencesOfRegex:reg4 withString:replaceWithString3]; 
//NSLog(@"%@\n%@\n%@\n%@\n",replace, replace1, replace2, replace3); 
//sectionz = [NSMutableArray arrayWithObjects: replace, nil]; 
       //NSMutableArray *voice = [NSMutableArray arrayWithObjects: replace, replace1, replace2, replace3, nil]; 
       NSMutableArray *voice = [NSMutableArray arrayWithObjects: replace, replace1, replace2, replace3, nil]; 
       NSDictionary *detVoice = [NSDictionary dictionaryWithObject:voice forKey:@"Elementi"]; 
       [listaOggetti addObject:detVoice];     
       NSLog(@"%@", listaOggetti); 

} 


//NSLog(@"%@",listaDettaglioOggetti); 
} 
if (lineString ==[lineString stringByMatching:reg3]) { print = NO;} 

} 
} else { 
NSLog(@"Error reading file '%@'", htmlString); 
} 

[av stopAnimating]; 
[spinThread release]; 
} 

这就是我如何配置我的旋转:

- (void)startSpinning { 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
av = [[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(195.0, 8.0, 30.0, 30.0) ] autorelease];  
av.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; 
[av hidesWhenStopped]; 
[self.view addSubview:av]; 
[av startAnimating]; 
[pool release]; 
} 

不幸运的,工作是表演,我看到的NSLog我的数据,AV启动和停止,但数据在我的表没有填充(我没有看到空表,我没有看到任何表)。 如果我不执行我的动画我得到我的右表与数据。 谢谢。

回答

0

我不知道这是正确的方式或不,但这对我工作正常。

-(void) yourFunctionThatPopulatesTableView 
{ 
    NSThread *spinThread=[[NSThread alloc] initWithTarget:self selector:@selector(startSpinner) object:nil]; 
    [spinThread start]; 

    //Populate TableView 

    //Last Line of he function 
    [av stopAnimating]; 
    [spinThread release]; 
} 

-(void)startSpinner 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    CGRect frame = CGRectMake(195.0, 8.0, 30.0, 30.0); 
    av = [[UIActivityIndicatorView alloc] initWithFrame:frame]; 
    av.activityIndicatorViewStyle=UIActivityIndicatorViewStyleGray; 
    [av hidesWhenStopped]; 
    [self.view addSubview:av]; 
    [av startAnimating]; 
    [pool release]; 
} 

任何由线程调用的函数都应该有一个NSAutoReleasePool按照文档。

+0

感谢您的回答。我尝试了你的方式,旋转开始,我看到我的控制台互联网数据,我已经要求,旋转停止,但我没有看到我的模拟器上的表。 – zebra 2010-11-25 18:36:00