Получить данные из блока iOS (Objective-C) - PullRequest
2 голосов
/ 27 ноября 2011

Итак, здесь простой метод с блоком

    -(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 Ответ

2 голосов
/ 27 ноября 2011

Мне кажется, что ты хочешь сохранить свой торт и съесть его тоже.Или есть метод, который вызывает асинхронный код и в то же время возвращает результаты синхронно.Вы можете превратить метод в синхронный, если это то, что вам нужно:

- (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 в другом блоке завершения.)

...