Use of delegates in NSOperation

后端 未结 4 787
滥情空心
滥情空心 2021-02-09 23:24

I am trying to make use of CLLocationManager in an NSOperation. As part of this I require the ability to startUpdatingLocation then wait u

4条回答
  •  庸人自扰
    2021-02-09 23:53

    UIWebView with UIWebViewDelegate method callbacks in an NSOperation

    A server I wanted to grab a URL from a server that changes values based upon JavaScript execution from various browsers. So I slapped a dummy UIWebView into an NSOperation and use that to grab out the value I wanted in the UIWebViewDelegate method.

    @interface WBSWebViewOperation () 
    
    @property (assign, nonatomic) BOOL stopRunLoop;
    @property (assign, nonatomic, getter = isExecuting) BOOL executing;
    @property (assign, nonatomic, getter = isFinished) BOOL finished;
    
    @property (copy, nonatomic, readwrite) NSURL *videoURL;
    @property (strong, nonatomic) UIWebView *webView;
    
    @end
    
    
    
    @implementation WBSWebViewOperation
    
    - (id)init
    {
        self = [super init];
        if (self) {
            _finished = NO;
            _executing = NO;
        }
    
        return self;
    }
    
    - (id)initWithURL:(NSURL *)episodeURL
    {
        self = [self init];
        if (self != nil) {
            _episodeURL = episodeURL;
        }
    
        return self;
    }
    
    - (void)start
    {
        if (![self isCancelled]) {
            self.executing = YES;
    
            [self performSelector:@selector(main) onThread:[NSThread mainThread] withObject:nil waitUntilDone:NO modes:[[NSSet setWithObject:NSRunLoopCommonModes] allObjects]];
        } else {
            self.finished = YES;
        }
    }
    
    - (void)main
    {
        if (self.episodeURL != nil) {
            NSURLRequest *request = [NSURLRequest requestWithURL:self.episodeURL];
            UIWebView *webView = [[UIWebView alloc] init];
            webView.delegate = self;
            [webView loadRequest:request];
    
            self.webView = webView;
        }
    }
    
    
    
    #pragma mark - NSOperation methods
    
    - (BOOL)isConcurrent
    {
        return YES;
    }
    
    - (void)setExecuting:(BOOL)executing
    {
        [self willChangeValueForKey:@"isExecuting"];
        _executing = executing;
        [self didChangeValueForKey:@"isExecuting"];
    }
    
    - (void)setFinished:(BOOL)finished
    {
        [self willChangeValueForKey:@"isFinished"];
        _finished = finished;
        [self didChangeValueForKey:@"isFinished"];
    }
    
    - (void)completeOperation
    {
        self.executing = NO;
        self.finished = YES;
    }
    
    - (void)cancel
    {
        [self.webView stopLoading];
        [super cancel];
        [self completeOperation];
    }
    
    
    
    #pragma mark - UIWebViewDelegate methods
    
    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {    
        NSString *episodeVideoURLString = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('playerelement').getAttribute('data-media')"];
        NSURL *episodeVideoURL = [NSURL URLWithString:episodeVideoURLString];
        self.videoURL = episodeVideoURL;
    
        if ([self.delegate respondsToSelector:@selector(webViewOperationDidFinish:)]) {
            [self.delegate webViewOperationDidFinish:self];
        }
    
        [self completeOperation];
    }
    
    @end
    

提交回复
热议问题