Iphone 目标C:在背景线程上启动一个对象——像往常一样交互?

Iphone 目标C:在背景线程上启动一个对象——像往常一样交互?,iphone,objective-c,multithreading,Iphone,Objective C,Multithreading,我希望有一个对象可以从主线程调用 MyObj* backgroundObject = [[MyObj alloc] initInBackground]; BOOL result = [backgroundObject computeResult]; 但是所有的背景对象计算方法都在另一个线程中 还有backgroundObj可以向其代表发送消息。我怎么能做这样的事?有可能吗?当然,您可以使用NSThread进行此操作,并让backgroundObject使用performselectornmai

我希望有一个对象可以从主线程调用

MyObj* backgroundObject = [[MyObj alloc] initInBackground];
BOOL result = [backgroundObject computeResult];
但是所有的背景对象计算方法都在另一个线程中


还有backgroundObj可以向其代表发送消息。我怎么能做这样的事?有可能吗?

当然,您可以使用
NSThread
进行此操作,并让
backgroundObject
使用
performselectornmainthread:
与代表联系

  • 文件

    • 对象不存在于AFAIK线程中。发送给对象的函数将始终在发送它的线程上执行(除非使用NSThread或performSelectorOnMainThread或类似的方法)。

      正如其他人所指出的,NSObject不存在于任何一个线程上,只有在开始执行其方法时,线程才会起作用

      我的建议是不要在每次对对象调用方法时都使用手动线程,而是使用NSOperations和NSOperationQueue。将NSOperationQueue作为对象的实例变量,并调用对象上的各种方法创建插入队列的NSOperations。NSOperationQueue将在后台线程上处理这些操作,从而避免对方法进行多次访问所需的所有手动线程管理

      如果使此NSOperationQueue的最大并发计数为1,还可以避免在后台线程上执行的各种操作之间锁定对象内的共享资源(当然,您仍然需要锁定可从外部访问的实例变量)

      对于委托或其他对象的回调,我建议使用
      -performselectornmainthread:withObject:waituntldone
      ,这样您就不必考虑使这些委托方法线程安全


      有关更多信息,请参阅。

      您需要的是一个NSOperation和一个block/delegate参数,用于通知调用方完成

      查看NSOperation和NSOperationQueues的文档,您应该使用:

      也许你可以看看苹果公司的这两个视频:

      • WWDC 2011-第210期-掌握中央大调度
      • WWDC 2011-第308期-街区和中央大调度实践

      @DevDevDev,关于什么?您需要在
      MyObj
      方法中创建和使用线程,然后使用
      performSelector:
      对主线程进行调用;你有更具体的问题吗?
      /*
       * I didn't initalised your object in background, because
       * because in the most cases you need your object to stick around
       * and only perfom the time consimung calculations in background
       */
      
      MyObj* backgroundObject = [[MyObj alloc] initInBackground];
      ...
      
      - (void)startBackgroundTask {
          dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
              //in a perfectly async non blocking block :-)
              BOOL result = [backgroundObject computeResult];
      
              dispatch_async(dispatch_get_main_queue(), ^{
              //post your result, or do something else with your result
                  [[NSNotificationCenter defaultCenter] postNotificationName:"backgroundComputeResultDone" object:[NSNumber numberWithBool:result]];
      
                  if (result) {
                      //do some stuff
                  }
              });
          });
      }