如何从后台线程返回数据?

时间:2013-02-25 15:35:40

标签: ios multithreading grand-central-dispatch

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

示例(这里数组结束为空,因为它在填充数组之前返回 - 我想做一些事情来返回填充的数组):

-(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 个答案:

答案 0 :(得分:6)

使用委托或阻止并取出return arrayToReturn;。在你的“for”和“dispatch_async”之后:

dispatch_async(dispatch_get_main_queue(),^{
      [myDelegate passComputedArray:arrayToReturn];
});

答案 1 :(得分: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
        }
        });
    });

传递completionHandler并完成后,执行您的功能

答案 2 :(得分:1)

如果你想等到它返回,就没必要给它背景了。

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

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

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

答案 3 :(得分: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