2009-07-25 37 views
0

我在这里遇到了一些问题,我让用户将一些视频上传到服务器,但是我在管理用于说明其进度的视图时遇到一些困难我知道为什么这个问题正在发生的事情,我发现它周围的方式(在某种程度上)在这里我的问题在iPhone上运行另一个进程时管理视图

所以,如果一个人试图做一些代码,看起来像这样(在一个UIViewController

-(void)uploadMovie 
{ 
    UIActivityView indicator=new... 
    [self.view addSubview:indicator] 
    [uploader UploadMyMovie:data] 

} 

此代码不会工作,上传者将锁定控制器,并且不会让指示符及时显示在屏幕上,我发现等待几秒钟重新呼吁上传者的作品,但我采取了另一种方法。

该方法是为上传器启动一个新线程,并有一个协议,上传器对象通知UIViewController(或某个委托)何时开始上传,其进度以及何时完成上传。喜欢的东西

 -(void)uploadMovie 
    { 
     UIActivityView indicator=new... 
     [self.view addSubview:indicator] 
     NSThread *thread=... 
     [thread start] 
    } 

委托方法是这个样子

#pragma mark UploadProgressDelegate 

-(void)didStartUploading 
{ 

    progressLabel= [[UILabel alloc] initWithFrame:CGRectMake(93, 240, 116, 32)]; 
    ind= [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
    ind.center=self.view.center; 
    [progressLabel setTextColor:[UIColor blackColor]]; 
    [progressLabel setText:@"TEST"]; 
    [self.view addSubview:progressLabel]; 
    [self.view addSubview:ind]; 
    [ind startAnimating]; 
    [self.view bringSubviewToFront:progressLabel]; 
    [ind setHidesWhenStopped:TRUE]; 
    [self.view setUserInteractionEnabled:FALSE]; 
} 
-(void)progressUpdate:(NSString*)progress 
{ 
    [progressLabel setText:progress]; 
} 
-(void)didEndUploading; 
{ 
    [progressLabel removeFromSuperview]; 
    [ind stopAnimating]; 
    [ind removeFromSuperview]; 
    [progressLabel release]; 
    [ind release]; 
    [self.view setUserInteractionEnabled:TRUE]; 
} 

这个伟大的工程和指示器显示和一切,然后我决定让用户看到通过添加一个UILabel进展(反映在上面的代码),然而对于这个解决方案不起作用,标签不显示,当然也没有更新...

我想知道是否有人遇到这种情况,并已为它提出了解决方案?或者,如果你都不可能从上面为什么标签心不是显示代码见...

感谢

回答

1

UIKit不是线程安全的。如果您正在更新UI元素,则需要重新进入主线程或者所有投注均已关闭。

1

在某些情况下,我发现,我需要回到主线程做某些事情。 ..

所以在你的委托方法你会做

[self performSelectorOnMainThread: @selector(updateLabel:) withObject:newLabelText waitUntilDone:NO]; 

然后

- (void) updateLabel:(NSString *)newLabelText 
{ 
    [progressLabel setText:newLabelText]; 
} 

虽然我不确定在主线程而不是在后台执行什么操作需要遵循什么规则。

+0

为什么有人标记这个人,他不知道从哪里j必须打这个电话,但我不得不打电话,谢谢你的帮助 – Daniel 2009-07-25 16:30:56

+0

谢谢你的支持:-) – 2009-07-25 18:15:12

相关问题