Arka plan iş parçacığından sunucuya eşzamansız istekleri denediğimde sorun yaşıyorum. Bu isteklerin hiçbir zaman sonuçlarını almadım. Sorunu gösteren basit bir örnek: SonraArka plan iş parçacığından sunucuya eşzamanlı istek
@protocol AsyncImgRequestDelegate
-(void) imageDownloadDidFinish:(UIImage*) img;
@end
@interface AsyncImgRequest : NSObject
{
NSMutableData* receivedData;
id<AsyncImgRequestDelegate> delegate;
}
@property (nonatomic,retain) id<AsyncImgRequestDelegate> delegate;
-(void) downloadImage:(NSString*) url ;
@end
@implementation AsyncImgRequest
-(void) downloadImage:(NSString*) url
{
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:20.0];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
receivedData=[[NSMutableData data] retain];
} else {
}
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
[delegate imageDownloadDidFinish:[UIImage imageWithData:receivedData]];
[connection release];
[receivedData release];
}
@end
ben ana iş parçacığı bu çağrı
asyncImgRequest = [[AsyncImgRequest alloc] init];
asyncImgRequest.delegate = self;
[self performSelectorInBackground:@selector(downloadImage) withObject:nil];
yöntem downloadImage aşağıda listelenmiştir:
-(void) downloadImage
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
[asyncImgRequest downloadImage:@"http://photography.nationalgeographic.com/staticfiles/NGS/Shared/StaticFiles/Photography/Images/POD/l/leopard-namibia-sw.jpg"];
[pool release];
}
sorun bu yöntem imageDownloadDidFinish asla denir olduğu . yöntemlerle
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse*)response
ait Üstelik hiçbiri denir. Ancak
[self performSelector:@selector(downloadImage) withObject:nil];
her şey tarafından
[self performSelectorInBackground:@selector(downloadImage) withObject:nil];
değiştirirseniz doğru çalışıyor. Async isteğinin iş bittiğinden önce arka plan iş parçacığının öldüğünü varsayar ve bu da soruna neden olur, ancak emin değilim. Bu varsayımlarda haklı mıyım? Bu problemden sakınmanın bir yolu var mı?
Bu sorunu önlemek için eşitleme isteğini kullanabileceğimi biliyorum, ancak bu basit bir örnektir, gerçek durum daha karmaşıktır.
Şimdiden teşekkürler.
, çözümlerin hiçbiri vardı CFRunLoopRun() ve CFRunLoopStop() kadar zarif. Bu, KVO protokolünü kullanarak "isExecuting" örnek değişkenleriyle uğraşmaktan daha iyidir. Unutulmaması gereken bir şey, @selector (performSelectorOnMainThread: withObject: waitUntilDone: modes :) modlarını [NSArray arrayWithObject: NSDefaultRunLoopMode] modları olarak kullanıyorum. UIKit gereksinimlerini karşılamak için ana iş parçacığı, UI etkileşimini pürüzsüz tutmak için NSDefaultRunLoopMode. Çok teşekkürler! –
Keşke daha fazla oy verebilirdim. Bu son derece yararlı oldu. –
ARC ile derlenen projeler için, 'NSAutoReleasePool' kullanılamaz, bu nedenle kod, '@autoreleasepool {gibi görünüyordu [self downloadImage: urlString]; CFRunLoopRun(); } ' – alokoko