0

バックグラウンドスレッドに入力された配列を返す必要があるメソッドがあります。配列が完全に入力されるまで、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

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
        }
        });
    });

completeHandlerを渡し、完了したら、関数を実行します

于 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];

});

}

ただし、そのreturn関数でUIの何かを更新したい場合は、バックグラウンドではなくメインスレッドでその関数を実行する必要があります。これを行うには、グローバルスレッドの代わりにメインスレッドを使用するperformSelector: onThread: withObject: waitUntilDone:か、別のスレッドを使用することができます。dispatch_async

于 2013-02-25T15:43:06.913 に答える