dispatch_async and block in iOS
Asked Answered
B

3

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.

Brebner answered 16/5, 2013 at 14:14 Comment(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?Ophir
If post == nil then [post dataUsingEncoding:NSUTF8StringEncoding] will return nil as well.Brophy
T
105

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.

Towhee answered 16/5, 2013 at 14:16 Comment(0)
C
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")
    }
}
Christa answered 28/7, 2016 at 15:4 Comment(4)
What does the , ^do? And for what swift version is this example for?Torrence
@GitSyncApp, I have updated my answer. Please check it up...:)Christa
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.Psychotechnology
Thats absolutely right @MiguelRojasCortés. I have updated my answer.Christa
E
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.
Eventuality answered 28/10, 2014 at 7:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.