2011-04-19 41 views
0

有点卡在这个问题上,我不知道,我哪里出错了。继承人我在做什么:UIProgressView,Theading,使用ASIHTTPRequest时执行SelectorOnMainThread

类调​​用:

- (void)updateApplicationDataInBackground { 


updateView = [[UpdatingView alloc] init]; 
[self.view addSubview:updateView.view]; 


DataSynchronizer *dataSynchronizer = [[DataSynchronizer alloc] init]; 

[NSThread detachNewThreadSelector:@selector(initWithDataRequest:) toTarget:dataSynchronizer withObject:self]; 

[dataSynchronizer release]; 

这将创建一个线程来从服务器检索数据并解析它。在DataSynchronizer这是被调用的方法:

- (void)initWithDataRequest:(id)parent { 

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

controller = parent; 

NSLog(@"DataSynchronizer initWithDataRequest called"); 

NSURL *url = [NSURL URLWithString: ApiUrl]; 

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request setPostValue:ApiKey forKey:@"key"]; 
[request setPostValue:ApiPass forKey:@"password"]; 
[request setPostValue:@"somevalue" forKey:@"framework"]; 
[request setPostValue:@"somevalue" forKey:@"method"]; 
[request setDidFinishSelector:@selector(parseResult:)]; 
[request setDidFailSelector:@selector(requestError:)]; 
[request setTimeOutSeconds:60]; 
[request setDelegate:self]; 
[request startAsynchronous]; 


[pool release]; 

我收到数据后,我分析的内容,做我的数据同步。这一切都按预期工作。我决定抛出一个UIProgressView,以便用户可以看到这个请求发生了什么,这个进度视图位于updateApplicationDataInBackground中创建的updateView中。

我没有试图显示Web服务调用的进度,而只是在数据处理中达到里程碑时。在DidFinishSelector了呼叫parseResult

有五种方法,其调用响应数据:

[self parseData:[data objectForKey:@"types"] forObject:[Types class] andParent:nil]; 
     [controller performSelectorOnMainThread:@selector(updateProgress:) withObject:[NSNumber numberWithFloat:.4] waitUntilDone:YES]; 

每一个过程,我试图更新UIProgressView后,它永远不会更新。现在,如果我只是从ASIHTTPRequest之外调用performSelectorOnMainThread,它会按预期工作,但不在DidFinishSelector中。我已经尝试了很多变种,在这里它调用了一个本地方法,它更新了mainThread,我简单地使用了performSelector。没有什么作品,我如何更新UIProgessView?

问题是线程产生线程的问题吗?

感谢

编辑:

貌似DidFinishSelector被称为主线程上了。我已经更新了我的代码只需拨打:

[controller updateProgress:[NSNumber numberWithFloat:.8]] 

仍然没有运气....

意识到这可能是有益的看到UIProgessView更新方法。

- (void)updateProgress:(NSNumber *)progress { 


float newProgess = [progress floatValue]; 


[updateView.myProgress setProgress: newProgess]; 

回答

1

好吧,看起来我在改变周围事物后找到了自己的答案。因为ASIHttpRequest在主线程上执行SetDidFinish选择器,所以我的调用performSelectorOnMainThread没有做任何事情。我改变了我最初的呼吁DataSynchronizer主线程,并加入改变了DidFinish方法:

- (void)parseDataInBackground:(ASIHTTPRequest *)request { 

[NSThread detachNewThreadSelector:@selector(parseResult:) toTarget:self withObject:request]; 

然后使上单独的线程解析方法运行(因为它的批量加工的,现在performOnMainThread工作没有问题。