Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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
Objective c 从块iOS中获取数据(目标C)_Objective C_Cocoa Touch_Objective C Blocks - Fatal编程技术网

Objective c 从块iOS中获取数据(目标C)

Objective c 从块iOS中获取数据(目标C),objective-c,cocoa-touch,objective-c-blocks,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 ret

因此,这里有一个简单的方法和一个块

    -(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。 我想找到一种方法,让GetPointsRange方法返回NSArray。 所以它的签名将是
-(NSArray*)getPointsInRange…

我可以简单地通过委派来完成,但我想在一个函数中完成所有工作。

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

- (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

GCD-savy信号量?方便的那么,在串行调度队列上调用调度信号量等待时会发生什么情况呢?我猜它将取消调度,但仍然被阻塞(因为否则它不会是串行的)。是的,队列将被阻塞,直到信号量发出信号。这意味着您很容易陷入死锁,这就是为什么我更喜欢使用常规完成块异步返回结果的原因。