私はIOSプログラミングに非常に慣れていません。NSURLConnectionを使用してデータを非同期にダウンロードするクラスを作成しました。
私は、送信されたデリゲートを使用して、父のクラスを更新します。父クラスの更新の一部には、ローカルプロパティに保存されているUIViewの呼び出しが含まれます。
これが私が意味するもののいくつかのコード例です:
私のクラス:
@synthesize myView = _myView;
-(void) loadMetaData
{
if(self.isMetadataLoaded)
{
[self.myView metadataLoaded];
}
else {
[_htmlLinter summarizeUrl:self.originalLink];
}
}
-(void) urlSummarized:(NSDictionary*)data
{
self.productTitle = [data objectForKey:@"title"];
self.productDescription = [data objectForKey:@"description"];
self.provider = [data objectForKey:@"provider_name"];
self.isMetadataLoaded= true;
[self.myView metadataLoaded];
}
htmlLinter:
-(void)summarizeUrl:(NSString*)url
{
NSURL* u = [[NSURL alloc] initWithString:request];
...
...
...
//removed a lot of logic that doesn't seem to be relevant
//Important to notice, that this is being called on a different thread though:
[self embedlyDidLoad:result];
}
-(void) embedlyDidLoad:(id)result
{
NSDictionary* properties = (NSDictionary*)result;
[_facilitator urlSummarized:properties];
}
奇妙なことに、myClassは、別のスレッドを介してアクセスしたときにself.myViewが何であるかを記憶していません。問題のある行は次のとおりです。[self.myViewmetadataLoaded];
loadMetaDataで最初に呼び出されたときに有効なポインターを返しますが、urlSummarizedの別のスレッドで呼び出した場合はnilです。
何が原因でしょうか?