Чтобы показать один MBProgressHUD
одновременно, вы можете проверить, добавлен ли HUD в том же виде или нет. Если нет, то добавьте HUD, иначе не добавляйте новый HUD.
-(void)showLoader{
dispatch_async(dispatch_get_main_queue(), ^{
BOOL isHudAlreadyAdded = false;
UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
NSEnumerator *subviewsEnum = [window.subviews reverseObjectEnumerator];
for (UIView *subview in subviewsEnum) {
if ([subview isKindOfClass:[MBProgressHUD class]]) {
isHudAlreadyAdded = true;
}
}
if(isHudAlreadyAdded == false){
[MBProgressHUD showHUDAddedTo:window animated:YES];
}
});
}
-(void)hideLoader{
dispatch_async(dispatch_get_main_queue(), ^{
UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
[MBProgressHUD hideHUDForView:window animated:YES];
});
}
Если у вас есть несколько функций в вашем cfm (даже если у вас их нет), поместите их в cfc. Затем вы можете использовать следующий шаблон URL-адреса для вызова определенного метода.
cfc с именем myEntityWS.cfc
<cfcomponent>
<cffunction name="updateDescription" access="remote" returntype="string">
<cfargument name="value" type="string" required="yes">
<cftry>
your code here
<cfcatch>
<cfoutput>
#cfcatch.Detail#<br />
#cfcatch.Message#<br />
#cfcatch.tagcontext[1].line#:#cfcatch.tagcontext[1].template#
</cfoutput>
</cfcatch>
</cftry>
</cffunction>
</cfcomponent>
Javascript
$.get('myEntityWS.cfc?method=updateDescription&value=someValue');
Вам не обязательно использовать «AJAX» (в частности, XML-часть), но вы можете использовать вызов удаленного сервера:
$.get('/execute-function.cfm?func=whatever', function (result) { $('#result').html(result); });
На самом деле зависит от того, что вам нужно делать с результат. Приведенный выше код поместит результат HTML в div на вашей странице:
<div id="result"></div>
Вы можете использовать асинхронный вызов и анализировать XML, но я обнаружил, что мне они редко нужны.
Вы не можете делать именно то, что пытаетесь сделать в своем примере кода. Однако у вас есть несколько вариантов.
Метод 1: Удаленно доступный объект
Переместите ваши функции в CFC и получите к ним доступ через URL-адрес CFC. Этот метод доступа требует, чтобы функция использовала атрибут разрешения access = 'remote'
- если установлено значение public (по умолчанию) или частный (или пакет, или любые уровни ролей и т. Д.), Вы получить ошибку «метод не найден» при попытке получить к нему удаленный доступ.
При этом вы создаете веб-сервис SOAP и используете его через AJAX. Вы делаете это, используя следующий формат в своем запросе jQuery:
http://domain.com/path/to/your.cfc?method=functionName&argument1=arg1Val&foo=bar&...
Если у вас есть ColdFusion 8, вы также можете указать аргумент URL returnFormat = 'format'
, который будет преобразовывать любые собственные объекты данных ColdFusion, которые вы вернуться к запрошенному формату на лету. Он поддерживает JSON, XML и WDDX.
foo.cfc
<cfcomponent output="false">
<cffunction name="foobar" output="false" access="remote" hint="...">
<cfargument name="arg1" type="string" required="true" />
...
<cfreturn someVar />
</cffunction>
</cfcomponent>
Доступ по URL-адресу:
http://domain.com/path/to/foo.cfc?method=foobar&arg1=some%20value&returnFormat=JSON
Метод 2: Удаленный прокси-объект
Отрицательная сторона подхода №1 состоит в том, что эффективность его работы снижается. создание экземпляров CFC, поэтому, если этот конкретный метод AJAX будет запускаться очень часто и / или ваш CFC содержит более нескольких методов или длиннее пары сотен строк, вы не хотите создавать его снова и снова для каждого запроса. Вместо этого вы можете изучить шаблон удаленного прокси , где вы кэшируете CFC, который реализует функциональность в области приложения, и имеете отдельный CFC «удаленный прокси», который намного легче и просто действует как прокси (отсюда и название) между HTTP-запросом и кэшированный CFC.
В этом шаблоне ваш бизнес-объект (тот, который имеет функцию, выполняющую реальную работу) может иметь access = public
(или пакет и т. д.), пока прокси имеет к нему доступ. Сам прокси должен иметь access = remote
.
proxy.cfc
<cfcomponent output="false">
<cffunction name="foobar" output="false" access="remote" hint="...">
<cfargument name="arg1" type="string" required="true" />
<!--- Application.foo is an instantiated object of foo.cfc --->
<cfreturn Application.foo.foobar(argumentCollection=arguments) />
</cffunction>
</cfcomponent>
Доступ по URL:
http://domain.com/path/to/proxy.cfc?method=foobar&arg1=some%20value&returnFormat=JSON
Метод 3: Сделай сам
Наконец, вы можете вручную реализовать функцию вызов и возврат в шаблоне CFM. Этот метод не требует (небольшого) снижения производительности при написании CFC, но для вас потребует больше набора текста и дополнительных потенциальных точек отказа. Сделать это, включите свои функции в шаблон CFM и обрабатывайте выходной поток только как поток текста, который будет возвращен браузеру.
Вы должны быть осторожны, управляя пробелами в возвращаемом значении (используйте output = false
в определениях функций, рассмотрите возможность использования
При таком подходе вы направляете свой запрос AJAX в файл .cfm с параметрами URL, а затем вам нужно для написания кода, который принимает эти параметры URL и передает их в функцию, а затем отображает (по сути, возвращает в запрос AJAX) результат функции.
foo. cfm
<cfsetting enableCFOutputOnly="true">
<cfparam name="arg1" default="defaultVal"/>
<cffunction name="foobar" output="false" access="remote" hint="...">
<cfargument name="arg1" type="string" required="true" />
...
<cfreturn someVar />
</cffunction>
<cfset variables.result = foobar(url.arg1) />
<cfoutput>#serializeJSON(variables.result)#</cfoutput>
Только что видел этот пост. Я использую cfc и jquery ajax для отображения кучи вычисленных значений. В моем cfc есть следующее:
<cfcomponent output="true">
<cfscript>
this.init();
</cfscript>
<cffunction name="init" access="public" returntype="any">
<cfset variables.dsn = application.dsn>
<cfreturn variables.dsn>
</cffunction>
<cffunction name="getFinanceTerms" access="remote" output="true" returntype="void">
<cfargument name="sales_price" type="numeric" required="yes">
<cfargument name="interestRate" type="numeric" required="yes">
<!--- some calculations here --->
#arguments.salesPrice# <!--- just to have something displayed --->
<cfreturn>
</cffunction>
</cfcomponent>
Я использую JQuery.ajax:
$.ajax({
type:"POST",
url:"financeTerms.cfc?method=getFinanceTerms",
data: "sales_price=55000&interestRate=5.99",
cache:false,
success: function(msg) {
$("#someDiv").html(msg);
}
});
Возможно, это будет еще кому-нибудь полезно ...