有点坚持这个问题,我不确定,我哪里出错了。继承人我正在做的事情:
班级电话:
- (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];
答案 0 :(得分:1)
好的,看起来我在改变一些事情之后找到了自己的答案。因为ASIHttpRequest在主线程上执行SetDidFinish选择器,所以我的调用performSelectorOnMainThread没有做任何事情。我将对DataSynchronizer的初始调用更改为主线程并添加了将DidFinish方法更改为:
- (void)parseDataInBackground:(ASIHTTPRequest *)request {
[NSThread detachNewThreadSelector:@selector(parseResult:) toTarget:self withObject:request];
然后使解析方法在单独的线程上运行(因为它的大部分处理和现在的performOnMainThread都没有问题。