1

私は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です。

何が原因でしょうか?

4

0 に答える 0