Making stringWithContentsOfURL asynchronous - Is it safe?

后端 未结 3 2012
灰色年华
灰色年华 2020-12-18 05:17

I attempted to make -[NSString stringWithContentsOfURL:encoding:error:] asynchronous, by running it a-synchronically from a background thread:

__block NSStri         


        
相关标签:
3条回答
  • 2020-12-18 05:49
    -(void)loadappdetails:(NSString*)appid {
        NSString* searchurl = [@"https://itunes.apple.com/lookup?id=" stringByAppendingString:appid];
    
        [self performSelectorInBackground:@selector(asyncload:) withObject:searchurl];
    
    }
    -(void)asyncload:(NSString*)searchurl {
        NSURL* url = [NSURL URLWithString:searchurl];
        NSError* error = nil;
        NSString* str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
        if (error != nil) {
            NSLog(@"Error: %@", error);
        }
        NSLog(@"str: %@", str);
    }
    
    0 讨论(0)
  • 2020-12-18 05:57

    You can also use:

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(queue, ^{
            NSError *error = nil;
            NSString *searchResultString = [NSString stringWithContentsOfURL:[NSURL URLWithString:searchURL]
                                                               encoding:NSUTF8StringEncoding
                                                                  error:&error];
            if (error != nil) {
                completionBlock(term,nil,error);
            }
            else
            {
                // Parse the JSON Response
                NSData *jsonData = [searchResultString dataUsingEncoding:NSUTF8StringEncoding];
                NSDictionary *searchResultsDict = [NSJSONSerialization JSONObjectWithData:jsonData
                                                                                  options:kNilOptions
                                                                                    error:&error];
                if(error != nil)
                {
                    completionBlock(term,nil,error);
                }
                else
                {
    
                    //Other Work here
                }
            }
        });
    

    But yes, it should be safe. I've been told though to use NSURLConnection instead due to error calls and such when communicating via the internet. I'm still doing research into this.

    0 讨论(0)
  • 2020-12-18 06:00

    That should be safe, but why reinvent the wheel?

    NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]];
    [NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        // etc
    }];
    
    0 讨论(0)
提交回复
热议问题