Это может быть проблемой параллелизма потока, если вы обрабатываете все в основном потоке, он будет зависать до полной загрузки ресурса. Я рекомендую отправить его в последовательную очередь в фоновом потоке, а после завершения загрузки отправить в основной поток.
пример тому:
-(void) GCDSerialQueuesDownload
{
NSString * anURL = @"myURL.com";
dispatch_queue_t serialQueue = dispatch_queue_create("com.dispatch.feed.serial.queue",DISPATCH_QUEUE_SERIAL);
dispatch_queue_t mainQueue = dispatch_get_main_queue();
void (^addFeedBlock)(NSString*) = ^(NSString* url) {
//your download here
dispatch_async(mainQueue,^{
//after finish you download
});
};
dispatch_async(serialQueue, ^{
addFeedBlock(anURL);
});
}
Ваш макрос может содержать __FUNCTION__
макрос. Не сделайте ошибку, имя функции будет вставлено в расширенный код во время компиляции, но это будет корректное имя функции для каждого вызова к Вашему макросу. Таким образом, "кажется", что это происходит во времени выполнения ;)
например.
#define THROW_IF(val) if (val) throw "error in " __FUNCTION__
int foo()
{
int a = 0;
THROW_IF(a > 0); // will throw "error in foo()"
}
Макрос препроцессора C++ __FUNCTION__
дает название функции.
Обратите внимание, что при использовании этого это действительно не получает имя файла, номер строки или имя функции во времени выполнения. Макросы расширены препроцессором и скомпилированы в.
__FUNCTION__
макрос, как __LINE__
, и __FILE__
, часть стандарта языка и является портативной.
Пример программы:
#include <iostream>
#using namespace std;
void function1()
{
cout << "my function name is: " << __FUNCTION__ << "\n";
}
int main()
{
cout << "my function name is: " << __FUNCTION__ << "\n";
function1();
return 0;
}
вывод:
my function name is: main my function name is: function1
Нет никакого стандартного решения. Однако BOOST_CURRENT_FUNCTION
является портативным для всех практических целей. Заголовок не не зависит ни от одного из других заголовков Повышения, так может использоваться автономный, если издержки целой библиотеки недопустимы.
__FUNCTION__
или __FUNC__
или __PRETTY_FUNCTION__
http://msdn.microsoft.com/en-us/library/b0084kay (По сравнению с 80) .aspx http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html
Можно использовать __FUNCTION__
макрос, который во время компиляции будет расширен до названия функции.
Вот пример того, как использовать его в утверждать макросе.
#define ASSERT(cond) \
do { if (!(cond)) \
MessageBoxFunction("Failed: %s in Function %s", #cond, __FUNCTION__);\
} while(0)
void MessageBoxFunction(const char* const msg, ...)
{
char szAssertMsg[2048];
// format args
va_list vargs;
va_start(vargs, msg);
vsprintf(szAssertMsg, msg, vargs);
va_end(vargs);
::MessageBoxA(NULL, szAssertMsg, "Failed Assertion", MB_ICONERROR | MB_OK);
}
В GCC вы можете использовать макрос __ PRETTY_FUNCTION __
.
У Microsoft также есть эквивалентный макрос __ func __
, хотя у меня его нет, чтобы попробовать.
например, чтобы использовать __ PRETTY_FUNCTION __
, поместив что-то подобное в начало ваших функций, и вы ' Я получу полную трассировку
void foo(char* bar){
cout << __PRETTY_FUNCTION__ << std::endl
}
, которая выведет
void foo(char* bar)
. У вас также есть макросы __ FILE __
и __ LINE __
, доступные во всех стандартных компиляторах c / c ++, если вы хотите вывести еще больше информации .
На практике у меня есть специальный класс отладки, который я использую вместо cout. Определив соответствующие переменные среды, я могу получить полную трассировку программы. Вы могли бы сделать что-то подобное. Эти макросы невероятно удобны, и действительно здорово иметь возможность включать подобную выборочную отладку в полевых условиях.
EDIT: очевидно __ func __
является частью стандарта? не знал этого. К сожалению, он дает только имя функции, но не параметры. Мне нравится __ PRETTY_FUNC __
gcc, но он не переносится на другие компиляторы.
GCC также поддерживает __ FUNCTION __
.