2014-01-16 3 views
0

Я разрабатываю библиотеку, которая получает данные с сервера json, и я использую NSURLSessionDataTask. Чтобы протестировать мою библиотеку, я создал новый проект, который вызывает этот библиотечный метод.NSURLSessionDataTask и блок обработчика

typedef void (^CompletionBlock)(); 
// More stuff... 
- (void)downloadAllPodcastsMetadataWithCompletionHandler:(CompletionBlock)block{ 

    NSURL *url = [NSURL URLWithString:@"MyServerURL"]; 

    NSURLSessionDataTask *dataTask = [self.session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    // Connection and response handling stuff... 
    // When my data is saved, executes the block parameter 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     block(); 
    }); 
    } 
    [dataTask resume]; 
} 

EDIT: Я забыл поставить [dataTask резюме] здесь, но это в моем коде. Сожалею.

EDIT 2: Итак, как некоторые из вас сказали, я изменил dispatch_sync с dispatch_async. Но результат тот же :(

В моем тестовом проекте я называю этот метод, как это.

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

[manager downloadAllPodcastsMetadataWithCompletionHandler:^{ 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
}]; 

Но сетевой активности Индикатор не показывает. Это как параметр блока не выполняется.

это потому, что он выполняет NSURLSessionDataTask логику внутри библиотеки, а затем я должен использовать что-то другое вместо dispatch_sync?

Я уже проверил NSURLSessionDataTask not executing the completion handler block, и я думаю, что сделать то же самое. Если это поможет s, менеджер - Singleton. Есть предположения?

спасибо.

+0

я написал класс, который может помочь вам: не https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch24p842downloader/ch37p1099downloader/MyDownloader.m – matt

+0

не используйте 'не dispatch_sync', если вы знаете, именно то, что вы делаете. Вы блокируете себя здесь! – matt

+0

Вау, спасибо за этот класс. Я проверю это: – WedgeSparda

ответ

0

Ну, я тупой.

В моем предыдущем коде произошла ошибка, которую я не заметил, поэтому война с завершающим блоком никогда не выполнялась. Это то, что происходит, когда у кого-то слишком много уверенности в его коде.

Извините, что беспокоило вас.

0

Необходимо загрузить с [dataTask resume];.

+0

Я забыл добавить [dataTask resume]; в вопросе, но нет в моем коде. Сожалею. – WedgeSparda

0

Необходимо добавить [dataTask resume]; а также добавьте это в обработчик завершения dispatch_async (dispatch_get_main_queue(),^{ [UIApplication sharedApplication] .networkActivityIndicatorVisible = NO; });

+0

Я забыл добавить [dataTask resume]; в вопросе, но нет в моем коде. Сожалею. Я положил [UIApplication sharedApplication] .networkActivityIndicatorVisible = НЕТ; внутри параметра блока, который принимает этот метод.Я так считаю, потому что это библиотека, нет приложения, поэтому этот способ может использоваться во многих приложениях. – WedgeSparda

0

Я проверил некоторый код.

Dispatch_sync не работает.

dispatch_sync(dispatch_get_main_queue(), ^{ 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
}); 

Dispatch_async работал для меня. Но мне пришлось поместить код на veiwWillAppear. Не уверен, что это произойдет, используя его в блок ...

dispatch_async(dispatch_get_main_queue(), ^{ 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
}); 
+0

Я изменился, но результат тот же. – WedgeSparda

+0

Вы прочитали это? http://stackoverflow.com/questions/13586166/issue-with-network-activity-indicator-placement – wolffan

+0

Вы читаете статью, не имеющую опыта? – wolffan

Смежные вопросы