Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在我的例子中,将块作为参数传递_Ios_Objective C_Objective C Blocks_Nsthread_Performselector - Fatal编程技术网

Ios 在我的例子中,将块作为参数传递

Ios 在我的例子中,将块作为参数传递,ios,objective-c,objective-c-blocks,nsthread,performselector,Ios,Objective C,Objective C Blocks,Nsthread,Performselector,我有一个函数,它将块作为参数: typedef void (^ MyBlock)(int); -(void)doTask:(MyBlock)theBlock{ ... } 我需要在另一个线程上运行上述函数,我想使用我的当前代码: NSThread *workerThread = [[NSThread alloc] init]; [workerThread start]; [self performSelector:@selector(doTask:) onTh

我有一个函数,它将作为参数:

typedef void (^ MyBlock)(int);

-(void)doTask:(MyBlock)theBlock{
 ...
}
我需要在另一个线程上运行上述函数,我想使用我的当前代码:

NSThread *workerThread = [[NSThread alloc] init];
[workerThread start];

[self performSelector:@selector(doTask:) 
             onThread:workerThread 
           withObject:???
        waitUntilDone:NO];
但是,如何使用这种方法传递
MyBlock
参数?(请不要建议使用GCD,我想知道如何使用当前代码,可能吗?

此答案假设您正在使用ARC。如果你不是,那么你需要多做一点,但总的来说答案是一样的

但是,如何使用这种方法传递
MyBlock
参数

块是一个对象,你不需要做任何特殊的事情。例如:

[self performSelector:@selector(doTask:) 
             onThread:workerThread 
           withObject:^(int arg){ NSLog(@"block passed: %d", arg); }
        waitUntilDone:NO];

HTH

首先创建这样的线程,使其处于活动状态,您可以从该线程调用方法

-(void) myThreadMainMethod: (id) sender {

    @autoreleasepool {
        NSRunLoop *runloop = [NSRunLoop currentRunLoop];
        [runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];

        while (true) { // add your condition for keeping the thread alive 
            [runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        }
    }
}

  NSThread* workerThread = [[NSThread alloc] initWithTarget:self
                                                 selector:@selector(myThreadMainMethod:)
                                                   object:nil];

    [workerThread start];
然后写下这样的东西

-(void)doTask:(MyBlock)theBlock{
        NSLog(@"do task called now execute the block");
        theBlock(1);
    }

    MyBlock block1 = ^(int a) {
        NSLog(@"integer %i", a);
    };

    [self performSelector:@selector(doTask:)
                 onThread:[NSThread mainThread]
               withObject:block1
            waitUntilDone:NO];

@克里里,你读过我的问题了吗?链接与我的问题无关。你读了第一行了吗?我听不懂你说的话,你能直接说出来吗?为什么要投反对票?谢谢。事实上,我的情况是这样的,请你仔细看一下:一个块一旦离开声明它的作用域就会变得无效,如果你把它存储在某个地方或者在另一个线程中执行它就会发生这种情况。为了避免麻烦,您需要传递[MyBlock copy]。例如,dispatch\u async()将为您执行此操作。这也是块属性应为“复制”的原因。我怀疑performSelector是否会自动执行此操作。@gnasher729-您发现了开始注释的原因。很长一段时间以来,块特性都不需要“复制”——只要您使用ARC。上面的示例运行良好,编译器执行编译器应该执行的操作–隐藏堆栈上的优化,并在需要时正确地将块移动到堆中。
-(void)doTask:(MyBlock)theBlock{
        NSLog(@"do task called now execute the block");
        theBlock(1);
    }

    MyBlock block1 = ^(int a) {
        NSLog(@"integer %i", a);
    };

    [self performSelector:@selector(doTask:)
                 onThread:[NSThread mainThread]
               withObject:block1
            waitUntilDone:NO];