objective-c – 在目标c中执行选择器主线程的最佳方法?
发布时间:2020-12-14 19:55:32 所属栏目:百科 来源:网络整理
导读:我正在为iPhone编写客户端 – 服务器应用程序.我有一个关于线程的问题.当我从设备访问我的在线数据库时,我需要在单独的线程上执行此操作以不冻结UI /主线程.但是当响应我从数据库中获取的数据时,我在主线程上调用此方法:performSelectorOnMainThread.问题是
我正在为iPhone编写客户端 – 服务器应用程序.我有一个关于线程的问题.当我从设备访问我的在线数据库时,我需要在单独的线程上执行此操作以不冻结UI /主线程.但是当响应我从数据库中获取的数据时,我在主线程上调用此方法:performSelectorOnMainThread.问题是,这只能让我向方法(WithObject)发送一个参数/对象,有时候我想传递更多的参数.关于它的另一件事是我必须通过这一个对象.如果我发现应用程序崩溃,我无法通过nil.
这是我今天的代码..我担心我正在使用这些方法并以错误的方式进行操作. - (IBAction)testServerAction:(id)sender { [self.imageView setHidden:YES]; [self.activityView setHidden:NO]; [self.activityView startAnimating]; dispatch_queue_t testServer = dispatch_queue_create("Test-Server-Thread",NULL); dispatch_async(testServer,^{ if ([self.arrayWithServerConnections count] > 0) { NSString *messageToShow; if ([self testServerMethod]) { messageToShow = @"Server is working!"; [self performSelectorOnMainThread:@selector(showMessageBoxWithString:) withObject:messageToShow waitUntilDone:YES]; [self performSelectorOnMainThread:@selector(threadedUIActivityRemover:) withObject:nil waitUntilDone:YES]; }else { messageToShow = @"Server is NOT working!"; [self performSelectorOnMainThread:@selector(showMessageBoxWithString:) withObject:messageToShow waitUntilDone:YES]; [self performSelectorOnMainThread:@selector(threadedUIActivityRemover:) withObject:nil waitUntilDone:YES]; } } }); dispatch_release(testServer); } -(void)threadedUIActivityRemover:(NSString *)string { [self.imageView setHidden:NO]; [self.activityView setHidden:YES]; [self.activityView stopAnimating]; } 这是一个很好的方法吗,除了performSelectorOnMainThread之外还有什么可以指向我的,那效果更好吗? 正如你所看到的,在这个例子中我将nil传递给NSString参数,因为我必须传递一些东西,如果我没有NSString作为方法中的arg,应用程序在传递nil时崩溃了evan ..为什么会这样?请让我对此更清楚一点! //谢谢! 解决方法
好吧,你已经在使用dispatch_async了.然后你应该使用
dispatch_async(dispatch_get_main_queue(),^ { ... } ); 从你的后台线程内部执行主线程上的事情.例如, if ([self testServerMethod]) { dispatch_async(dispatch_get_main_queue(),^ { [self showMessageBoxWithString: @"Server is working!"]; [self threadedUIActivityRemover:nil]; } ); }else ... 它对您调用的方法的参数数量没有任何限制. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |