Реализация протокола NSURLConnectionDataDelegate

Я новичок в iOS-разработке. Я пытаюсь реализовать протокол NSURLConnectionDataDelegate, но кажется, что ни один из методов делегата никогда не вызывается. Мне пришлось вводить методы делегата в себя, он должен генерироваться автоматически?

У меня есть команда NSLog в каждом методе делегата, но ничего не печатается. Я использую NSURLConnection для асинхронной загрузки и отслеживания прогресса, чтобы позже обновить progressView.

Файл SearchFeed.h (Обратите внимание, что я пытался реализовать протокол, когда вводил NSURLConnectionDataDelegate

#import <Foundation/Foundation.h>
#import "Doc.h"


@interface SearchFeed : NSObject <NSXMLParserDelegate, NSURLConnectionDataDelegate>
{
    NSMutableString * currentElementValue;

    Doc *currentDoc;


}
@property(strong,nonatomic) NSURL * searchUrl;
@property(strong,nonatomic) NSArray * searchResults;
//@property(retain, nonatomic) Doc * currentDoc;
@property(retain, nonatomic) NSMutableArray *docs;
//@property(retain, nonatomic) NSURLConnection *urlConnection;
@property(retain, nonatomic) UIProgressView * progressBar;


-(void)retrieveFromInternet;
-(double) getProgress;

+(NSString *)pathToDocuments;
+(void)downloadPDFToMyDocumentsFrom:(NSString*) PDFUrl filename:(NSString *) title;
+(NSArray *)listFilesAtPath:(NSString *)path;
@end

Файл SearchFeed.m:

#import "SearchFeed.h"

@implementation SearchFeed

@synthesize searchUrl = _searchUrl; //where to search from
@synthesize searchResults = _searchResults; // Not being used -- I think
//@synthesize currentDoc = _currentDoc; //current Doc
@synthesize docs = _docs; //array of Docs
@synthesize progressBar = _progressBar; 



NSURLConnection *urlConnection;
double fileLength =0;
double lastProgress =0;
double currentLength =0;
NSOutputStream *fileStream;

+(void)downloadPDFToMyDocumentsFrom:(NSString*) PDFUrl filename:(NSString *) title {

NSURL *url = [[NSURL alloc] initWithString:PDFUrl];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];

urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];


NSString *fileName = [title stringByAppendingPathExtension:@"pdf"];
NSString *filePath = [[self pathToDocuments] stringByAppendingPathComponent:fileName];

fileStream = [[NSOutputStream alloc] initToFileAtPath:filePath append:YES];

[fileStream open];
}
//handling incoming data
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    double length = [data length];
    currentLength += length;
    double progress = currentLength/fileLength;

    NSLog(@"Receiving data");

    if(lastProgress < progress)
    {
        //progressBar WRITE code to update the progress for the progress bar

        lastProgress = progress;
        self.progressBar.progress = lastProgress;

        NSLog(@"%f -------------------------------------------------------", lastProgress);
    }

    NSUInteger left = [data length];
    NSUInteger nwr = 0;

    do {
        nwr = [fileStream write:[data bytes] maxLength:left];

        if(nwr == -1)
            break;
        left -= nwr;
    }while(left>0);

    if(left)
    {
        NSLog(@"Stream error: %@", [fileStream streamError]);
    }
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    long length = [response expectedContentLength];
    fileLength = length;

     NSLog(@"%f ------------------------------------------------------- is the fileLength", fileLength);
}

//handling connection progress

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
        //WRITE code to set the progress bar to 1.0
    self.progressBar.progress = 1.0;
    [fileStream close];
     NSLog(@"%f -------------------------------------------------------", lastProgress);
}

Я установил делегат для urlConnection NSURLConnection на себя, который является классом SearchFeed.m. В SearchFeed.h я попытался реализовать протокол NSURLConnectionDataDelegate. Мне пришлось создать методы connectionDidFinishLoading, didReceiveResponse и didReceiveData, но эти методы не вызываются.

Я либо не реализовал протокол должным образом, ИЛИ я объявил некоторые методы как +, а некоторые как - (некоторые методы являются методами класса, а некоторые - методами экземпляра)

downloadPDFToMyDocumentsFrom — это метод класса, который вызывается, когда пользователь нажимает «Загрузить». Этот метод устанавливает NSURLConnection, устанавливает URL-адрес и т. д., а также делегат и открывает файловый поток для получения данных. Однако ни один из других методов не вызывается.


person Bilal    schedule 05.09.2013    source источник
comment
stackoverflow.com/questions/9577317/   -  person Eric    schedule 06.09.2013


Ответы (1)


Ваш метод downloadPDFToMyDocumentsFrom настроен как метод класса (+), и вы настраиваете своего делегата как self, что в данном случае означает класс. Вы должны сделать метод downloadPDFToMyDocumentsFrom методом экземпляра (-), чтобы self был экземпляром объекта.

person coneybeare    schedule 05.09.2013
comment
В этом есть смысл. self в этом контексте указывает на имя класса, а изменение его на метод экземпляра указывает на экземпляр класса. У меня было ощущение, что это было так, но я не хотел все менять. - person Bilal; 06.09.2013