Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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 目标C:等待方法中的最后一次调用_Ios_Objective C_Grand Central Dispatch - Fatal编程技术网

Ios 目标C:等待方法中的最后一次调用

Ios 目标C:等待方法中的最后一次调用,ios,objective-c,grand-central-dispatch,Ios,Objective C,Grand Central Dispatch,我有一个被多次调用的方法。但我只需要在最后一个方法调用中执行操作。我尝试了dispatch_async,但没有成功,因为仍在排队等待调用: -(void)doingSomething:(NSString*)someValue { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [NSThread sleepForTimeInterval:1.0f];

我有一个被多次调用的方法。但我只需要在最后一个方法调用中执行操作。我尝试了dispatch_async,但没有成功,因为仍在排队等待调用:

-(void)doingSomething:(NSString*)someValue
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [NSThread sleepForTimeInterval:1.0f];
        dispatch_async(dispatch_get_main_queue(), ^{
            // do something with the last call
        });
    });
}
你们中有人知道如何排队,只使用最后一个电话吗


非常感谢您的帮助

我的建议是使用
调度组
。在调用
dispatch\u async
之前,先调用
dispatch\u group\u enter
,然后调用
dispatch\u group\u leave
dispatch\u async
执行的块的末尾。然后,在将所有块排队后,使用
dispatch\u group\u notify
计划完成块,它将在所有其他
dispatch\u async
块完成后运行

dispatch_group_t group = dispatch_group_create();

for (...) {
    dispatch_group_enter(group);

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        ...
        dispatch_group_leave(group);
    });
}

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    // This gets called when all the other blocks have finished
});
或者,您可以使用
NSOperationQueue
而不是libdispatch,并执行一个完成操作,将所有其他操作作为依赖项列出。不过,这样做的缺点是不会在主队列上执行完成操作

NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
    // This gets called when all the other operations have finished
}];

for (...) {
    NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        ...
    }];

    [completionOperation addDependency:operation];
    [operationQueue addOperation:operation];
}

[operationQueue addOperation:completionOperation];

你想等最后一个做某事的电话还是什么意思。恐怕我一点也不明白NSOperationQueue它将如何只使用最后一次对该方法的调用?我添加了一个基于
NSOperationQueue
的示例作为编辑。从您的两个示例中。将执行对该方法的所有调用。查看您的示例实现,最后一个调用是如何执行的?将您只希望执行一次的部分放入
调度队列\u notify
块(对于第一个示例)或
完成操作
(对于第二个示例)。你放在那里的代码将只执行一次,在所有其他事情都完成之后。你这样做的目的是什么?