从块iOS(Objective-C)中获取数据

时间:2011-11-27 06:41:45

标签: objective-c cocoa-touch objective-c-blocks

所以,这是一个带块的简单方法

    -(void)getPointsInRange:(double)radius nearByPoint:(SGPoint *)nearByPoint
{
    SGStorageQuery *query = [SGStorageQuery queryWithPoint:nearByPoint layer:SimpleGeoMainLayerName];

    [query setRadius:radius];
    [mainClient retain];
    [mainClient getRecordsForQuery:query
                      callback:[SGCallback callbackWithSuccessBlock:
                                ^(id response) {
                                    // you've got records!
                                    // to create an array of SGStoredRecord objects...

                                    NSArray *records = [NSArray arrayWithSGCollection:response  type:SGCollectionTypeRecords];
                                    NSLog(@"records received:%i",[records count]);

                                    [self arrayOfPointsReceived:records];
                                } failureBlock:^(NSError *error) {
                                    // handle failure
                                    NSLog(@"getPointsInRange error:%@",[error description]);
                                }]];


}

该方法连接到某个SDK并返回带有结果的NSArray。 我想找到一种方法,getPointsInRange方法将返回NSArray。 所以它的签名是-(NSArray*)getPointsInRange... 我可以通过委托来完成,但我想在一个函数中完成所有操作。

1 个答案:

答案 0 :(得分:2)

在我看来,你想要保留你的蛋糕并吃掉它。或者有一个调用异步代码的方法,同时返回结果。您可以将方法转换为同步方法,如果这是您想要的:

- (void) computeSomethingAndReturnSynchronously
{
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [self doSomeAsynchronousOperationWithCompletion:^{
        // take the call results here
        dispatch_semaphore_signal(semaphore);
    }];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_release(semaphore);
}

这将运行异步代码,然后阻止执行,直到异步调用的结果可用。这有帮助吗? (我应该补充一点,我宁愿保持代码异步并在另一个完成块中返回NSArray。)