代码之家  ›  专栏  ›  技术社区  ›  zebra

iphone nsurlconnect、tableview和活动指示器

  •  1
  • zebra  · 技术社区  · 14 年前

    我有一个方法,它执行一个连接来检索一些数据并弹出一个tableview。 这个方法很有效。 现在我在viewDidLoad中启动这个方法

    [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];
    }
    

    (我已经在viewDidLoad中初始化了这个)

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

    哪里是开始和停止我的活动的更好的地方?

    我试着从

    [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 =@".+class=\"dettaglioSoglie.*";
     NSString *reg3 =@"</table>";
    NSString*reg4=@"<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 start和stop,但是数据没有填充到我的表中(我没有看到空表,我没有看到任何表)。 如果我不执行我的动画,我得到我的正确的数据表。 谢谢。

    1 回复  |  直到 14 年前
        1
  •  0
  •   ipraba    14 年前

    我不知道这是不是正确的方法,但这对我很好。

    -(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。