【问题标题】:performSelectorOnMainThread with multiple parameter具有多个参数的 performSelectorOnMainThread
【发布时间】:2011-10-07 21:50:17
【问题描述】:

我正在尝试在主线程上执行此操作:

[curItem.mButton setBackgroundImage:newArt forState:UIControlStateNormal];

所以我这样做...

cWrapperObject* obj = [cWrapperObject alloc];
[obj setupParams :curItem.mButton :newArt];
[obj performSelectorOnMainThread:@selector(setImageForButton) withObject:nil waitUntilDone:YES];

我觉得这很糟糕,有人对我如何以不同的方式处理这个问题有任何建议吗?

【问题讨论】:

    标签: iphone objective-c ios multithreading asynchronous


    【解决方案1】:

    另一个选项是 GCD。您可以调用主队列上的一个块,该块在运行循环运行时串行运行。块不限于一个对象,例如 performSelectorOnMainThread。

    dispatch_async(dispatch_get_main_queue(), ^{
       // code here
    });
    

    我在这里写了一个更全面的 performSelectorXXX 和 GCD 比较,并附有示例:

    GCD, Threads, Program Flow and UI Updating

    另外,这是另一个相关的 SO 帖子:

    GCD to perform task in main thread

    【讨论】:

      【解决方案2】:

      如果你只需要传递一个参数,你应该在方法performSelectorOnMainThread:withObject:waitUntilDone中设置“withObject:”参数。所以你的方法应该声明为

      -(void)setImageForButton:(id)parameter
      

      你应该在主线程上调用方法:

      [obj performSelectorOnMainThread:@selector(setImageForButton:) withObject:newArt waitUntilDone:YES];
      

      注意@selector(setImageForButton:) 中的':' 这意味着该方法将使用一个参数发送消息,并在withObject: 中传递

      【讨论】:

        猜你喜欢
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        • 2011-04-15
        • 2011-08-01
        • 1970-01-01
        • 2021-08-01
        • 1970-01-01
        相关资源
        最近更新 更多