私はobjective-cに対して比較的新しいスレッド同期の問題があります。私はユーザーに画像を返そうとしています(ユーザーが提供した画像URLを通じて)。私は別のスレッドでイメージのダウンロードを開始しています。スレッド関数は現在のクラスで宣言され、定義されています。 NSURLConnection方法の問題スレッドが実行なっているがあり、私のイメージのダウンロード機能が働いていない(つまり、何が呼び出されない得ているスレッドと画像のダウンロードを開始するためのマルチスレッドの問題
私のクラスの機能は次のとおりです。
- (NSMutableData*)download:(NSString*)strURL
{
self.strURLData=strURL;
[NSThread detachNewThreadSelector:@selector(threadMethod:) toTarget:[ICacheImageDownloadMgr class] withObject:self];
//Here ICacheImageDownloadMgr is my current class
while(!bCompletionFlag)
{
if(bCompletionFlag)//bCompletionFlag is set to TRUE in NSURLConnection::connectionDidFinishLoading method after successful image download
{
return currentData;
}
}
}
。ここで私の唯一の動機は、画像のダウンロード処理が完了した後に、ユーザーに、「CURRENTDATA」を返すことです そして、私の現在のクラス(すなわち、ICacheImageDownloadMgr)で宣言されたスレッドの方法は次のとおりです。
+ (void) threadMethod:(ICacheImageDownloadMgr*)param
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
if(param.currentData)
{
[param.currentData release];
param.currentData=nil;
}
param.currentData = [[NSMutableData alloc]initWithLength:0];
NSURL *myURL = [[NSURL alloc] initWithString:param.strURLData];
NSURLRequest *URLRequest = [NSURLRequest requestWithURL: myURL];
param.urlcon = [[NSURLConnection alloc]initWithRequest:URLRequest delegate:self startImmediately:YES];
[myURL release];
param.dataLock = [[NSLock alloc]init];
while(!param.bCompletionFlag)
{
if([param.dataLock tryLock])
{
if(param.bCompletionFlag)//bCompletionFlag is set to TRUE in NSURLConnection::connectionDidFinishLoading method after successful image download, along with NSLock unlock call
{
break;
}
}
}
[pool release];
}
私がここで間違っていることを教えてください。両方のスレッドがブロックされているようですので、NSURLConnectionメソッドが呼び出されません。再度、前述のように、私の唯一の目的は、 "currentData"をユーザーに返すことです。
おかげで、あなたのコードで
sendSynchronousRequestを使用していただきありがとうございます。それはまさに私がやろうとしていたものです。私のコードは今働いています。しかし、なぜdidReceiveResponse、didReceiveData、およびconnectionDidFinishLoadingのようなNSURLConnectionデリゲートメソッドの実装が私のコードで呼び出されていなかったのか、私はまだ理解できません。私はtiaで述べたように、メインスレッドのwhileループがアプリケーション自体をブロックしていたと思います。 – XMarshall
スレッド内に実行ループを作成しているはずです...あなたのスレッドでは、応答が処理されないようにしています。http://developer.appleを読むことができます。 com/library/ios /#documentation/Cocoa /概念的/マルチスレッディング/ RunLoopManagement/RunLoopManagement.html – sergio