iOS 的 delegate 方法是在主线程执行的?

2014-03-10 10:51:17 +08:00
 androidBrant
在delegate中同步请求网络,结果阻塞了。

请教各位大神,delegate方法到底是在主线程还是非主线程执行的?
7454 次点击
所在节点    程序员
23 条回复
qdvictory
2014-03-10 10:55:36 +08:00
和这个没关系。UI必须在主线程更新。
androidBrant
2014-03-10 10:58:37 +08:00
@qdvictory e 我是说我在delegate中同步请求网络,结果把ui阻塞了。。。
offspring
2014-03-10 11:05:44 +08:00
你想让它在主线程它就在主线程 你不想让它在主线程 它就不在主线程
alexrezit
2014-03-10 11:07:28 +08:00
你让它在哪儿就在哪儿.
damngood
2014-03-10 11:10:18 +08:00
不仅仅是 UI 才有 delegate

如果你指的是 XXView 的 delegate 的话, 那么一般来说是在 main thread 上执行的, 毕竟一般来说不会在 view 外部直接调用 delegate 方法, 而是在 main thread 对 view 做了某某操作导致 delegate 方法的调用.
l6751902
2014-03-10 11:12:02 +08:00
这个你可以自己抄作,
看具体实现啦
androidBrant
2014-03-10 11:30:21 +08:00
@offspring
@alexrezit

什么 意思?
假设我有一个网络请求的类,在viewController中用了,并设置了代理,当网络返回后,viewController中的代理方法执行了,那这个代理方法是在主线程执行的还是在非主线程执行的?
androidBrant
2014-03-10 11:33:28 +08:00
@l6751902
@damngood

假设我有一个网络请求的类,在viewController中用了,并设置了代理,当网络返回后,viewController中的代理方法执行了,那这个代理方法是在主线程执行的还是在非主线程执行的?
txx
2014-03-10 11:40:06 +08:00
@androidBrant 你自己 log 一下 当前是不是主线程 不就完了么....与其来问不如自己检验..
soulgain
2014-03-10 11:42:59 +08:00
这个问题问的是不明确,这个delegate是那个类的,是你自己写的还是什么。
如果说你那个网络类用的是NSURLConnection,那他的delegate是会在主线程执行的,so你在那个delegate里面调用同步的方法,确实会阻塞。
offspring
2014-03-10 11:45:12 +08:00
@txx 都不用log 下个断点就好了
alexrezit
2014-03-10 11:45:16 +08:00
@androidBrant
原来在哪个线程还在哪个线程.
alexrezit
2014-03-10 11:48:05 +08:00
@txx
同. 或者加 breakpoint.
txx
2014-03-10 11:49:42 +08:00
@offspring 好吧...老毛病犯了...凡是能静态调试的都不去动态调试....
l6751902
2014-03-10 11:53:45 +08:00
设置代理后,代理的内容由你指定的对象来执行

其实写成代码就是这么个感觉:

class object {
objectDlg *delegate

funtion do(){
self.delegate()
}



object *_object = [[object alloc]init];
_object.delegate = foo //相当于用你的方法替换掉原来对象自己的方法
_object.do()//这句展开就是 do(){ self.foo()}

相当于那个对象会在某个时候调用你写的方法,
要么那个对象处于异步方法中。
要不他的执行代理时用异步方法来执行。
如果看不到源码需要你去试一下。
那如果对象本身是同步的,但你在回调中不希望主线程阻塞,那么需要在回调中使用异步方法。
l6751902
2014-03-10 11:54:38 +08:00
好久没写代码了。。。当伪代码看吧。。把objc和py的格式搞混了
androidBrant
2014-03-10 11:56:54 +08:00
@txx thx 偶尔犯傻,已验证,代理是在主线程中执行的。。
androidBrant
2014-03-10 12:02:30 +08:00
@l6751902 嗯,应该是看委托对象是在哪个线程
alexrezit
2014-03-10 12:03:32 +08:00
@txx
以后我也要学习虾神的做法!
kingme
2014-03-10 13:24:34 +08:00
有一种撞头像的感觉,,,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/103614

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX