作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在后台线程的 NSOperation 内部执行异步 NSURLConnection。
(这是因为我正在对数据执行一些非常昂贵的操作,因为它们返回时希望在数据进入和后台时完成)
这是我的第一次尝试:
在我的 AppDelegate 中:
// create the opperation and add it to the queue:
self.sharedOperationQueue = [[[NSOperationQueue alloc] init] autorelease];
LibXMLOperation *op = [[[LibXMLOperation alloc] init] autorelease];
[self.sharedOperationQueue addOperation:op];
这是我的操作:
@interface EbirdLibXMLOperation : NSOperation {
@private
NSURLConnection *urlConnection;
// Overall state of the parser, used to exit the run loop.
BOOL done;
// properties to maintain the NSOperation
BOOL finished;
BOOL executing;
}
- (void)downloadAndParse:(NSURL *)url;
- (void)start;
- (BOOL)isConcurrent;
- (BOOL)isFinished;
- (BOOL)isExecuting;
@property BOOL done;
@property (nonatomic, retain) NSURLConnection *ebirdConnection;
// The autorelease pool property is assign because autorelease pools cannot be retained.
@property (nonatomic, assign) NSAutoreleasePool *downloadAndParsePool;
@end
@implementation LibXMLOperation
@synthesize urlConnection, done;
- (void)start{
if (![self isCancelled]) {
[self willChangeValueForKey:@"isExecuting"];
executing = YES;
//set up the thread and kick it off...
[[NSURLCache sharedURLCache] removeAllCachedResponses];
NSURL *url = [NSURL URLWithString:@"http://google.com"];
[NSThread detachNewThreadSelector:@selector(downloadAndParse:) toTarget:self withObject:url];
[self didChangeValueForKey:@"isExecuting"];
} else {
// If it's already been cancelled, mark the operation as finished.
[self willChangeValueForKey:@"isFinished"];
finished = YES;
[self didChangeValueForKey:@"isFinished"];
}
}
- (BOOL)isConcurrent {
return YES;
}
- (BOOL)isExecuting {
return executing;
}
- (BOOL)isFinished {
return finished;
}
- (void)downloadAndParse:(NSURL *)url {
self.downloadAndParsePool = [[NSAutoreleasePool alloc] init];
done = NO;
self.characterBuffer = [NSMutableData data];
[[NSURLCache sharedURLCache] removeAllCachedResponses];
NSURLRequest *theRequest = [NSURLRequest requestWithURL:url];
urlConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (urlConnection != nil) {
do {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
} while (!done);
}
[self willChangeValueForKey:@"isFinished"];
[self willChangeValueForKey:@"isExecuting"];
finished = YES;
executing = NO;
// Clean up.
self.urlConnection = nil;
[downloadAndParsePool release];
NSLog(@"download and parse cleaning up");
self.downloadAndParsePool = nil;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
}
#pragma mark NSURLConnection Delegate methods
// Disable caching so that each time we run this app we are starting with a clean slate.
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
return nil;
}
// Forward errors to the delegate.
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
done = YES;
}
// Called when a chunk of data has been downloaded.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
// Process the downloaded chunk of data.
NSLog(@"Did received %i bytes", [data length]);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
// Set the condition which ends the run loop.
done = YES;
}
@end
运行时,我在日志中看到以下消息:
2009-08-20 15:18:48.858 App[1001:3e03]*** _NSAutoreleaseNoPool(): Object 0x1126a20 of class NSCFArray autoreleased with no pool in place - just leaking
Stack: (0x305a2e6f 0x30504682 0x3057deba 0x305ced09 0x30577ddf 0x3056b43e 0x3050764a 0x58fc3 0x3050a79d 0x3050a338 0x94568155 0x94568012)
此事件发生在最后一个 [self didChangeValueForKey:@"isFinished"];这表明我设置的 NSOperation 是错误的。
最佳答案
移动线条:
[downloadAndParsePool release];
self.downloadAndParsePool = nil;
到 -downloadAndParse:
方法的末尾。
关于iphone - 如何在 NSOperation 中执行异步 NSURLConnection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1304508/
我是一名优秀的程序员,十分优秀!