0

我有一个方法应该返回一个填充在后台线程中的数组。我想等待返回语句,直到数组完全填充。我该怎么做?我知道如何处理没有返回类型的数据,但我想调用这个函数并获取填充的数组。

示例(此处数组最终为空,因为它在填充数组之前返回 - 我想做一些事情来返回填充的数组):

-(NSArray*)fetchSomeArray{

    __block NSArray *arrayToReturn;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) {

        NSArray *someArray = ...; // getting some array from database
        arrayToReturn = [NSMutableArray new];

        for(int i=0;i<someArray.count;i++){

            [arrayToReturn addObject:...];
        }

    });

    return arrayToReturn;

}
4

4 回答 4

7

使用委托,或阻止并取出return arrayToReturn;. 在您的“for”之后和“dispatch_async”内部:

dispatch_async(dispatch_get_main_queue(),^{
      [myDelegate passComputedArray:arrayToReturn];
});
于 2013-02-25T15:42:45.110 回答
4
- (void)someMethod:(void (^)(BOOL result))completionHandler {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //all your functionality

        // Check that there was not a nil handler passed.
        if( completionHandler ){
            //your function to so that you can return
        }
        });
    });

传递完成处理程序,完成后,执行您的功能

于 2013-02-25T15:45:30.723 回答
1

如果您想等到它返回,则无需将其置于后台。

-(NSArray*)fetchSomeArray{
    NSArray *someArray = ...; // getting some array from database
    return someArray;
}

但我敢打赌,你真的想用返回值做一些事情,这需要一些时间来计算而不阻塞主线程,所以你可以将数组传递回同一对象或其他地方的方法。

-(void)fetchSomeArray{
    __block id bself = self;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) {
        NSArray *someArray = ...; // getting some array from database
        [bself arrayFetched:someArray];
    });

    return arrayToReturn;
}

-(void)arrayFetched:(NSArray*)array{
    // do something with the returned array
}
于 2013-02-25T15:45:23.313 回答
0

处理这个问题的最简单方法是在数组完成后调用一个函数并在那里处理数组。

-(void)fetchSomeArray{
    __block NSArray *arrayToReturn;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) {

    NSArray *someArray = ...; // getting some array from database
    arrayToReturn = [NSMutableArray new];

    for(int i=0;i<someArray.count;i++){

        [arrayToReturn addObject:...];
    }

    [self finishedArrayResult:arrayToReturn];

});

}

但是,如果您希望该返回函数更新 UI 中的任何内容,则需要在主线程而不是后台运行该函数。为此,您可以使用performSelector: onThread: withObject: waitUntilDone:或使用另一个dispatch_async使用主线程而不是全局线程。

于 2013-02-25T15:43:06.913 回答