Objective c Cocoa:发出url数据请求,运行本地DOM修改javascript,存储修改后的html

Objective c Cocoa:发出url数据请求,运行本地DOM修改javascript,存储修改后的html,objective-c,xcode,cocoa,nsurlconnection,Objective C,Xcode,Cocoa,Nsurlconnection,假设我有一些来自网页的数据: NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myurl]]; [request setHTTPMethod:@"GET"]; NSData* returnedData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error]; NSString*

假设我有一些来自网页的数据:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myurl]];
[request setHTTPMethod:@"GET"];
NSData* returnedData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
NSString* html = [[NSString alloc] initWithData:returnedData encoding:NSUTF8StringEncoding];
我还有一个本地javascript脚本,它对数据运行一些查询并修改DOM。目前,为了实现这一点,我正在使用上面收到的HTML,创建一个webview并将其加载到其中:

[NSString stringWithFormat:@"<script>%@</script>%@", myscript, html];
这就给我留下了修改过的DHTML,我可以随心所欲地使用它。然而,这看起来一点也不优雅,特别是因为创建WebView只允许在主线程上进行,而且整个过程最好也在后台线程中运行,脚本偶尔会抛出一个错误,并且webview加载事件没有被调用,因此我有越来越多的行专门用于处理此事件的超时。总而言之,这是一个丑陋的大烂摊子

在理想的情况下,我会在第一次使用javascript时完全不创建webview。我一直在尝试各种事情,比如:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myurl]];
[request setHTTPMethod:@"GET"];
NSData* returnedData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
NSString* html = [[NSString alloc] initWithData:returnedData encoding:NSUTF8StringEncoding];
NSString* modifiedhtml = [request stringByEvaluatingJavaScriptFromString: myscript]];
其中脚本设置为返回页面,但无效


关于如何比我现在更优雅、更有效地处理这个问题,有什么建议吗?

为了避免使用web视图,并假设您的html有一个头标签,您可以这样做:

NSArray *tempArray = [html componentsSeparatedByString:@"<head>"];
NSString *modifiedHtml = [NSString stringWithFormat:@"%@<head>%@%@", [tempArray objectAtIndex:0], yourScriptString, [tempArray objectAtIndex:1]];

它会将您的脚本插入到现有的head标记中。您应该通过常规的健全性检查来完成代码。

我不太清楚您想要实现什么:如果问题是在后台发送请求,那么异步发送请求,使用NSURLConnectionDelagate方法connection:didReceiveData:连接响应数据和ConnectiondFinishLoading:修改接收的html并创建和加载webView。@MichelePercich当您说使用ConnectiondFinishLoading:修改接收的html时,我想使用javascript进行这些修改,所以我需要一种方法来处理javascript并将其应用到收到的html中。你已经写过,你已经有了解决方案,这就留给我修改后的html,我可以用它来做我想做的事。。那么,你还需要什么呢?是的,这很适合我的需要-这个问题纯粹是学术性的-问题真的是-这是呈现一些javascript的最有效和最优雅的方式吗?是否有一种解决方案不需要像webview创建那样使用主线程。
NSArray *tempArray = [html componentsSeparatedByString:@"<head>"];
NSString *modifiedHtml = [NSString stringWithFormat:@"%@<head>%@%@", [tempArray objectAtIndex:0], yourScriptString, [tempArray objectAtIndex:1]];