ASynchronous NSURLConnection внутри NSOperation с NSInvocation? - PullRequest
0 голосов
/ 10 февраля 2012

Я должен использовать Asynchrnous NSURLConnection внутри NSOPeration в фоновом режиме, потому что его ответ имеет большие данные. Я должен избегать кодирования Apple с конечной длиной, чтобы использовать его в didEnterBackground. Вместо этого я использую следующий код через NSOperation with NSInvocation, ноне работает.connectToServer имеет операцию NSURLConnection. Может ли помочь какая-нибудь помощь? didReceiveData, не были вызваны методы делегатаReRereResponse?

 -(void)viewDidLoad
 {
 NSOperationQueue *queue = [NSOperationQueue new];

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                        selector:@selector(connectServer)
                                                                          object:nil];

[queue addOperation:operation];
[operation release];
[queue autorelease];

}

 -(void)connectServer
{


NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSURLConnection *theConnection = [[[NSURLConnection alloc] initWithRequest:theRequest delegate:self] autorelease];

    if( theConnection )
    {
        webData = [[NSMutableData data] retain];
    }
    else
    {
        NSLog(@"theConnection is NULL");
    }
}

}

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

мммм, может быть, вы могли бы сделать соединение внутри блока для главной очереди следующим образом:

dispatch_async(dispatch_get_main_queue(), ^{

        NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0];
        _connection = [[NSURLConnection alloc] initWithRequest:request startImmediately:YES];
        [request release];
});

и затем должны быть вызваны методы делегата.

1 голос
/ 10 февраля 2012

Когда вы хотите запустить NSURLConnection во вторичном потоке, вам нужно добавить это соединение в runloops

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url 
                cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0];
    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self
                 startImmediately:YES];
    [request release];


[_connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_connection start];

    [pool release];
0 голосов
/ 10 февраля 2012

Я могу ошибаться по этому поводу, но все же попробую ...

См. Документы говорят ... для start метод

start Вызывает начало соединениязагрузка данных, если это еще не сделано.

  • (void) start Обсуждение Вызов этого метода необходим только в том случае, если вы создаете соединение с помощью метода initWithRequest: Delegate: startImmediately: и задаете NO для параметра startImmediately,Если вы не запланировали соединение в цикле выполнения или в очереди операций до вызова этого метода, подключение запланировано в текущем цикле выполнения в режиме по умолчанию.

, поэтому кажется,мне нужно будет установить соединение вручную, так как оно находится в очереди операций.поправьте меня, если я ошибаюсь.

...