How to make program wait for asynchronous NSURLConnection to finish before proceeding with next command?

后端 未结 6 1780
日久生厌
日久生厌 2021-02-01 09:10

How can I make my program wait for an asynchronous NSURLConnection to finish before going to the next line of code?

SetDelegate *sjd= [SetDelegate alloc];
NSURLC         


        
6条回答
  •  走了就别回头了
    2021-02-01 09:41

    If you just want to know when it's complete and don't really care about any data, simply use the NSNotificationCenter to post a notification and have your view subscribe to it.

    Delegate - Post Notification upon completion

    -(void) connectionDidFinishLoading:(NSURLConnection*)connection {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"NSURLConnectionDidFinish" object:nil];
    }
    

    View - Add observer and run some code when observed

    -(void) viewDidLoad {
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                              selector:@selector(yourCleanupMethod)
                                                   name:@"NSURLConnectionDidFinish"
                                                  object:nil];
    }
    
    -(void) yourCleanupMethod {
        // finish up
    
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    

    Now, if you need to pass a simple object back as data you can try loading up the object parameter in your notification like this:

    [[NSNotificationCenter defaultCenter] postNotificationName:@"NSURLConnectionDidFinish" object:yourDataObject];
    

    Then change your view and cleanup signature like this:

    -(void) viewDidLoad {
    
    // Notice the addition to yourCleanupMethod
    [[NSNotificationCenter defaultCenter] addObserver:self
                                              selector:@selector(yourCleanupMethod:)
                                                   name:@"NSURLConnectionDidFinish"
                                                  object:nil];
    }
    
    -(void) yourCleanupMethod:(NSNotification *)notif {
        // finish up
        id yourDataObject = [notif object];
    
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    

    Now I found myself needing something a little more than this so I ended up creating a singleton to handle all of my requests. Since all of your delegate methods in NSURLConnectionDelegate give you and instance of the NSURLConnection for the specific connection, you can simply store a mutable data object in a dictionary and look it up each time by the connection. From there I have a method signature that takes and object and selector in that I associate with the connection so after everything has wrapped up, I can pass that mutable data object to the requestor by performing the selector on that object.

    I won't include all of that code here but maybe that will help get you thinking about what is possible. I found that I had a lot of code tied up in making web service calls so wrapping everything up in a singleton gave me a nice clean way of getting data. Hope this helps!

提交回复
热议问题