Skip to main content

Calling depending Web Services + dispatch_group_t in iOS

What is the best approach to call the web services in a chain?

Create a dispatch group

    dispatch_group_t serviceGroup;

Call the first function/web service

-(void)callFirstWebService {
    serviceGroup = dispatch_group_create();

//Call 1st web service here, In the completion block, call the second method which you want to perform serially
[self callSecondWebService];


 dispatch_group_notify(serviceGroup,dispatch_get_main_queue(),^{
        // Won't get here until everything has finished        
        NSLog(@"All Tasks finished");
//Reload table or another task which you want to perform when both service finished
        
    });
}


-(void) callSecondWebService{
    dispatch_group_enter(serviceGroup);
//Call 2nd web service and in the completion block, write the below code

        dispatch_group_leave(serviceGroup);
}


//*******************Theoretical Explantion*****************

  1. Create a method where you want to call webservice. Depending on response, you want to call another webservice/method. After completion of all task, you want to perform last task which you write in first method itself (dispatch_group_notify).
  2. Create the dispatch group in first method
  3. In second method(which you want to perform serially), write dispatch_enter and dispatch_leave. It will ensure that the second task completed successfully.
  4. When all the dispatch groups leave, the dispatch group gets notified automatically and block will executes.

Comments

Popular posts from this blog

Play youtube video in iOS app

Youtube video can be played in iOS app using webview. MPMoviePlayerController is not able to open youtube video automatically. Integrate the below script to show thumbnail, clicking on it the video will play in full screen.


NSString *url = @"https://www.youtube.com/embed/8aMHGC6A5zc"; NSString* embedHTML = @"\     <html><head>\     <style type=\"text/css\">\     body {\     background-color: transparent;\     color: white;\     }\     </style>\     </head><body style=\"margin:0\">\     <iframe id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \     width=\"%0.0f\" height=\"%0.0f\" frameborder=\"0\" feature=player_detailpage allowfullscreen></iframe>\     </body></html>"; NSString* html = [NSStringstringWithFormat:embedHTML, url, self.view.frame.size.width, 200.0];
    [webviewloadHTMLString:html baseURL:nil];


///*******************A…

Disabling print for Production In Swift Project

You'll need to set up a compiler flag to use the Swift preprocessor - go to the Swift Compiler - Custom Flags section of Build Settings to set up a -D DEBUG flag:



Then in your code you can define a DLog() function and only print your message if the DEBUG flag is set:
func DLog(message: String, function: String = __FUNCTION__) { #if DEBUG     println("\(function): \(message)") #endif }

Collection view inside table view with NO vertical scrolling

UICollectionView inside a UITableViewCell — dynamic height?
Given the following structure: TableViewTableViewCellCollectionViewCollectionViewCellCollectionViewCellCollectionViewCell[...variable number of cells or different cell sizes]
The solution is to tell auto layout to compute first the collectionViewCell sizes, then the collection view contentSize, and use it as the size of your cell. This is the UIView method that "does the magic": -(void)systemLayoutSizeFittingSize:(CGSize)targetSize      withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority            verticalFittingPriority:(UILayoutPriority)verticalFittingPriority






Full code is available here to download.
Thanks to this awesome answer.