iOS 的 delegate 方法是在主线程执行的? - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
androidBrant

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

  •  
  •   androidBrant Mar 10, 2014 8034 views
    This topic created in 4448 days ago, the information mentioned may be changed or developed.
    在delegate中同步请求网络,结果阻塞了。

    请教各位大神,delegate方法到底是在主线程还是非主线程执行的?
    Supplement 1  &nbp; Mar 10, 2014
    假设我有一个网络请求的类,在viewController中用了,并设置了代理,当网络返回后,viewController中的代理方法执行了,那这个代理方法是在主线程执行的还是在非主线程执行的?
    Supplement 2    Mar 10, 2014
    已解决,代理在主线程中执行

    demo:创建一个ViewController,一个Test类(类中有一个TestDelegate协议)
    在vc中设置test的delegate,结果delegate的方法显示是在main thread执行
    23 replies    1970-01-01 08:00:00 +08:00
    qdvictory
        1
    qdvictory  
       Mar 10, 2014
    和这个没关系。UI必须在主线程更新。
    androidBrant
        2
    androidBrant  
    OP
       Mar 10, 2014
    @qdvictory e 我是说我在delegate中同步请求网络,结果把ui阻塞了。。。
    offspring
        3
    offspring  
       Mar 10, 2014
    你想让它在主线程它就在主线程 你不想让它在主线程 它就不在主线程
    alexrezit
        4
    alexrezit  
       Mar 10, 2014
    你让它在哪儿就在哪儿.
    damngood
        5
    damngood  
       Mar 10, 2014
    不仅仅是 UI 才有 delegate

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

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

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

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

    class object {
    objectDlg *delegate

    funtion do(){
    self.delegate()
    }



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

    相当于那个对象会在某个时候调用你写的方法,
    要么那个对象处于异步方法中。
    要不他的执行代理时用异步方法来执行。
    如果看不到源码需要你去试一下。
    那如果对象本身是同步的,但你在回调中不希望主线程阻塞,那么需要在回调中使用异步方法。
    l6751902
        16
    l6751902  
       Mar 10, 2014
    好久没写代码了。。。当伪代码看吧。。把objc和py的格式搞混了
    androidBrant
        17
    androidBrant  
    OP
       Mar 10, 2014
    @txx thx 偶尔犯傻,已验证,代理是在主线程中执行的。。
    androidBrant
        18
    androidBrant  
    OP
       Mar 10, 2014
    @l6751902 嗯,应该是看委托对象是在哪个线程
    alexrezit
        19
    alexrezit  
       Mar 10, 2014 via iPad
    @txx
    以后我也要学习虾神的做法!
    kingme
        20
    kingme  
       Mar 10, 2014
    有一种撞头像的感觉,,,
    androidBrant
        21
    androidBrant  
    OP
       Mar 10, 2014
    @kingme
    krafttuc
        22
    krafttuc  
       Mar 10, 2014
    你在哪个线程给delegate发消息,delegate的方法就在哪个线程执行。
    sharpnk
        23
    sharpnk  
       Mar 10, 2014
    "在delegate中同步请求网络" - 我觉得你应该考虑一下你的设计。用代理的目的就是给异步执行操作时间长的request用的,你在callback中做network request完全是与设计初衷背道而驰了。
    About     Help     Advertise     Blog     API     FAQ     Solana     4465 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 67ms UTC 05:31 PVG 13:31 LAX 22:31 JFK 01:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86