33

What this piece of code mean?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        TMBaseParser *parser=[[TMBaseParser alloc] init];
        parser.delegate=self;
        NSString *post =nil;
        NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];
        [parser parseForServiceType:TMServiceCategories postdata:postData];
    });

please explain it briefly.

2
  • That code looks weird: first post is set to nil. In the next line a message is sent to post. That won't do anything, will it? Commented May 16, 2013 at 15:52
  • If post == nil then [post dataUsingEncoding:NSUTF8StringEncoding] will return nil as well. Commented May 16, 2013 at 17:23

3 Answers 3

104

The piece of code in

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

});

is run asynchronously on a background thread. This is done because parsing data may be a time consuming task and it could block the main thread which would stop all animations and the application wouldn't be responsive.

If you want to find out more, read Apple's documentation on Grand Central Dispatch and Dispatch Queue.

Sign up to request clarification or add additional context in comments.

Comments

7

If the above code snippets doesn't work then, try this:

Objective-C:

dispatch_async(dispatch_get_main_queue(), ^{

});

UI updates should always be executed from the main queue. The "^" symbol indicates a start of a block.

Swift 3:

DispatchQueue.global(qos: .background).async {
    print("This is run on the background queue")

    DispatchQueue.main.async {
        print("This is run on the main queue, after the previous code in outer block")
    }
}

4 Comments

What does the , ^do? And for what swift version is this example for?
@GitSyncApp, I have updated my answer. Please check it up...:)
Just a little clarification: "Sometimes even the background thread wont be able to update the UI and there you have to force the main thread to execute the code into the main queue" this is not right, UI updates MUST be always performed on the main thread, this is not optional at all.
Thats absolutely right @MiguelRojasCortés. I have updated my answer.
2

That is a Grand Central Dispatch block.

  1. dispatch_async is a call to run on another queue.
  2. dispatch_get_global_queue is a call to get a specific queue with the desired characteristics. For example, the code could be run at a low priority on the DISPATCH_QUEUE_PRIORITY_BACKGORUND.
  3. Inside the block, the code does nothing. Post is set to nil. Then a message is sent to nil "dataUsingEncoding." Objective C drops all calls to nil. Finally, the parser is sent "nil" postData.
  4. At best, this will do nothing. At worst sending the parser nil data will crash.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.