0

プロパティとして辞書を持つ追跡クラスの単一のインスタンスを作成しています。要素をディクショナリに追加すると、ディクショナリ キーの数が変化することがわかります。しかし、アクセスすると、以下のようなメッセージでクラッシュが発生します。

[__NSCFString 接続:didReceiveData:];

[__NSCFArray reqmap]; 等..

基本的に、リクエストのURLをNSDataインスタンスにマッピングしているため、レスポンスを適切にマッピングして非同期に追加できます。

コード:

-(id)init
{
    self = [super init];
    if (self) 
    {
        self.cacheDict = [[NSMutableDictionary alloc] initWithCapacity:20];
        self.reqmap = [[NSMutableDictionary alloc] initWithCapacity:20];
    }
    return self;
}

+ (CommunityImageCache*)getSharedCommunityImageCache
{
    if (sharedCommunityImageCacheInstance == nil) {
        sharedCommunityImageCacheInstance = [[super allocWithZone:NULL] init];
    }
    return sharedCommunityImageCacheInstance;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSString* keyurl = [[[connection currentRequest] URL] absoluteString];
 //crash point >>>>
    NSMutableData* tempdata = (NSMutableData*)[self.reqmap objectForKey:keyurl];
    [tempdata appendData:data];
    
}


- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection 
{
    NSString* keyurl = [[[theConnection currentRequest] URL] absoluteString];
    NSMutableData* tempdata = [self.reqmap objectForKey:keyurl];
    UIImage* img = [UIImage imageWithData:tempdata];  
    [self.cacheDict setObject:img forKey:[@"image:\\\\public\\" stringByAppendingString:keyurl]];
    [self.reqmap removeObjectForKey:keyurl];
}


-(UIImage *)getImageFromUrl:(NSString *)url
{
    UIImage* image = nil;
    
        image = [self.cacheDict objectForKey:url];
        if (!image) 
        {
            image = [UIImage imageNamed:@"defaultProfile.png"];
            //dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
            
            NSString* localUrl = [NSString stringWithString:url];
            NSString* finurl = [localUrl substringFromIndex:[@"image:\\\\public\\" length]]; 
            UIImage* img = nil;
            NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:finurl]
                                                     cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                 timeoutInterval:60.0];
            
            NSMutableData* data = [[NSMutableData alloc] init];
            NSURLConnection* connect = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
            NSString* keyurl = [[[connect currentRequest] URL] absoluteString];
            [self.reqmap setObject:data forKey:keyurl];
}
}

ひどく必要でした、前もって感謝します。

4

2 に答える 2

0

さて、reqmap には NSMutableData オブジェクトが含まれているはずですよね?[self.reqmap setValue:[[NSMutableData alloc] init] forKey:@"TheKey"]; のようなインスタンス化が必要です。

于 2012-07-05T20:23:55.507 に答える
0

また、実装する必要があります

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 

NSURLConnection を使用している場合。上記のコードには表示されません。次に、この関数でデータを割り当て/リセットする必要があります。

あなたが見ている実際のエラーは何ですか?reqmap が NSDictionary ではないか (上記のコードにあります)、取得しているオブジェクトが NSMutableData ではないようです。

合計で、次を実装します。

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
于 2012-07-05T22:18:57.700 に答える