AFNetworking完成后返回数据

时间:2014-05-06 08:39:22

标签: objective-c asynchronous ios7 afnetworking afnetworking-2

我的代码出现了异步问题。我在一堂课上得到了所有的网络资料。我的一个请求需要返回另一个类需要使用的NSMutableArray。我的webRequest代码在这里:

- (NSMutableArray*) getTournamentsInClub:(NSString *)clubGUID withDelegateViewController:(UIViewController *)viewController {

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSMutableArray *responseArray = [[[NSMutableArray alloc] init] autorelease];
NSString *URL = [[NSString alloc]initWithFormat:@"SomeURL=%@",clubGUID];
[manager POST:URL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

    for (id obj in responseObject){
        //NSLog(@"obj: %@",[obj valueForKey:@"CustomerName"]);
        [responseArray addObject:obj];
    }

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
return responseArray;
}

我从viewController中调用这个方法:

[self handleClubTournaments:[[TournamentsWebService sharedToursWS] getTournamentsInClub:

//Show load screen. (hide in handler function)
GP_MobilAppDelegate *xdelegate = [[UIApplication sharedApplication] delegate];
[xdelegate showLoadingScreen:self.clubToursTableView andStatus:NSLocalizedString(@"loadTours", @"")];

我的handleClubTournaments功能如下所示:

-(void) handleClubTournaments:(id)result {

GP_MobilAppDelegate *xdelegate = [[UIApplication sharedApplication] delegate];

if([result isKindOfClass: [NSError class]]) {
    // If an error has occurred, handle it
    [xdelegate hideLoadingScreen];
    [[TournamentsWebService sharedToursWS] showErrorMessageAccordingToFault:result];
    return;
}

if([result isKindOfClass: [SoapFault class]]) {
    [xdelegate hideLoadingScreen];
    // If a server error has occurred, handle it
    [[TournamentsWebService sharedToursWS] showErrorMessageAccordingToFault:result];
    return;
}

//Do something with result...

if ([result count] > 0) {

    NSLog(@"Antal klubturneringer: %d", [result count]);
    //Start by removing excisting tours
    [self.tournamentsSourceArray removeAllObjects];
    NSMutableArray *tempArray=[NSMutableArray array];

    for (GGTournamentData *t in result) { //cast object in result list and add them to array

        [tempArray addObject:t];

    }
    self.tournamentsSourceArray = [self sortByStringDate:tempArray]; //sort by date

    [tempArray release];

    NSLog(NSLocalizedString(@"tourLoadet", @""));
}

[self.clubToursTableView reloadData];
[xdelegate hideLoadingScreen];

//Scroll view
if (self.tournamentsSourceArray.count > 0) { //hvis det er turneringer..
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:[self findIndexOfMonthClosestToDate]];
    [self.clubToursTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
}

所以我的问题是在我的异步任务完成之前返回NSMutableArray。我知道异步任务的行为与此类似,但是如何在我的webrequest(getTournamentsInClub)获取一些数据之前确保我的handleClubTournaments函数没有运行?

提前致谢。

1 个答案:

答案 0 :(得分:2)

我认为你不知道异步操作是如何工作的。永远不会设置NSMutableArray,因为它是同步返回的。 在您的情况下,我建议您与代表合作。

- (void)getTournamentsInClub:(NSString *)clubGUID withDelegateViewController:(UIViewController *)viewController completionBlock:(void (^)(NSMutableArray *result))completionBlock {
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    NSMutableArray *responseArray = [[[NSMutableArray alloc] init] autorelease];
    NSString *URL = [[NSString alloc]initWithFormat:@"SomeURL=%@",clubGUID];
    [manager POST:URL parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

        for (id obj in responseObject) {
            [responseArray addObject:obj];
        }

        // Request finished. Call the block.
        completionBlock(responseArray);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

- (void)handleClubTournaments {
    GP_MobilAppDelegate *xdelegate = [[UIApplication sharedApplication] delegate];
    [[TournamentsWebService sharedToursWS] getTournamentsInClub:^(NSMutableArray *result) 
    {
         // Hide the Loading Indicator. Do something with the Result.
    }];

    // You can't access the result synchronously, therefore it's impossible to depend on it synchronously.
}

另一种异步返回数据的方法是块,类似于AFNetworking解决方案。

您可以详细了解如何开始使用块here以及如何使用委托here