在iOS中创建我自己的完成块

在iOS中创建我自己的完成块,ios,objective-c,grand-central-dispatch,Ios,Objective C,Grand Central Dispatch,我有一个对象,它需要很长时间来做一些事情(它从服务器下载数据) 如何编写自己的完成块以便运行 [downloader doSomeLongThing:^(void) { //do something when it is finished }]; 我不确定如何将此块保存在downloader对象中。您可以复制该块,然后调用它: typedef void (^CallbackBlk)(); @property (copy) CallbackBlk cb; - (void)doSome

我有一个对象,它需要很长时间来做一些事情(它从服务器下载数据)

如何编写自己的完成块以便运行

[downloader doSomeLongThing:^(void) {
    //do something when it is finished
}];

我不确定如何将此块保存在downloader对象中。

您可以复制该块,然后调用它:

typedef void (^CallbackBlk)();

@property (copy) CallbackBlk cb;

- (void)doSomething:(CallbackBlk)blk
{
    self.cb = blk;

    // etc.
}

// when finished:
self.cb();

由于在回调中不使用任何参数,因此可以使用标准的dispatch\u block\t,并且由于您只想在长流程完成后调用它,因此不需要使用属性跟踪它。你可以这样做:

- (void)doSomeLongThing:(dispatch_block_t)block
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // Perform really long process in background queue here.

        // ...

        // Call your block back on the main queue now that the process 
        // has completed.
        dispatch_async(dispatch_get_main_queue(), block);
    });
}
然后按照指定的方式实现它:

[downloader doSomeLongThing:^(void) {
    // do something when it is finished
}];

您只是想知道如何编写一个接受块的方法吗?现在我明白了为什么有些人用Xcode标记东西(尽管这是错误的),但是“最大公约数”。。。怎么会这样?哈哈!我没有贴标签。我把GCD放在中央调度中心。它一定是变了。谢谢,我会保留这个以备将来参考。在我的实际代码中有几个参数,我需要两个不同的块。这是针对NSURLConnection的完成/错误,但我不能使用sendAsynch。。。我明白了。在这种情况下,你也可以考虑看看AFNetworking。关于这些图书馆是否能让事情变得更好,存在着争论。在我看来,基于块的API使AFNetworking成为一个非常简单和方便的库。你可以在这里看一下,然后自己决定。谢谢。我来看看。我现在已经创建了我的课程,它看起来很好,但我会考虑将来。有人可以看一下我的相关问题: