如何暂停/停止功能,直到SOAP请求完成

如何暂停/停止功能,直到SOAP请求完成

问题描述:

编辑:我遇到的问题是,我使用TapKu日历,所以我依靠提供的代表。这里是problm:如何暂停/停止功能,直到SOAP请求完成

- (NSArray*) calendarMonthView:(TKCalendarMonthView*)monthView marksFromDate:(NSDate*)startDate toDate:(NSDate*)lastDate{ 

//SOAP Request has NSURLConnection which runs asychonrous delegate methods. 
//SOAP Request will return before the data array has been populated 
[self SOAPRequest:startDate]; 

//i need to do something like this, however the SOAPRequest will return and get stuck into the loop instead of the asychronos delegates firing 
//therefore i can never set bGettingData to NO. 
int iWait; 
while (bGettingData) { 
    iWait++; 
} 

return dataArray; 

}

你好,

在应用程序中,我创造,我靠SOAP请求来检索数据,解析XML和填充数组。

我的问题是,当我检查数组是空的,因为SOAP请求尚未完成。我如何阻止我的代码执行直到SOAP请求完成并恢复代码?这可以通过回调或线程完成吗?

感谢

不幸的是,在使用TapKu日历时,不能通过SOAP异步加载数据库。您必须同步加载日历,因为数据完成加载后,它们无法刷新日历视图。如果你每个月有超过40条记录,这会造成巨大的5-6秒延迟。

你要确实等待答案是完整的 - 回调通常是最容易。究竟如何取决于你正在使用的编程库/语言(以上是javascript,objectiveC,你是手工编码还是以一个例子开始)。

查看Iphone SOAP request step by step tutorial的答案 - 如http://macresearch.org/interacting-soap-based-web-services-cocoa-part-1http://brismith66.blogspot.com/2010/05/iphone-development-accesing-soap.html。或者按照https://developer.omniture.com/node/321 - 只是等到答案完全到达。

不要暂时停止,睡眠或等待,而是简单地退出/退出/从当前例程/函数/方法返回。

将当前的“东西”分解为多个代码片段,每个片段都在自己的方法中。

使用后续的方法做下一步工作,并使异步网络/ SOAP请求的完成例程调用该方法。

基本上,你的问题是,你仍然在思考程序编码。适当的范例是使用事件驱动编码:让操作系统调用你的代码,而不是让你的代码调用操作系统并等待。

这的确是可能的,因为在日历视图的例子,修改_refreshDataPageWithAtIndex是这样的:

- (void) _refreshDataWithPageAtIndex:(NSInteger)index{ 

    UIScrollView *sv = self.pages[index]; 
    TKTimelineView *timeline = [self _timelineAtIndex:index]; 


    CGRect r = CGRectInset(self.horizontalScrollView.bounds, HORIZONTAL_PAD, 0); 
    r.origin.x = self.horizontalScrollView.frame.size.width * index + HORIZONTAL_PAD; 
    sv.frame = r; 



    timeline.startY = VERTICAL_INSET; 

    for (UIView* view in sv.subviews) { 
     if ([view isKindOfClass:[TKCalendarDayEventView class]]){ 
      [self.eventGraveYard addObject:view]; 
      [view removeFromSuperview]; 
     } 
    } 

    if(self.nowLineView.superview == sv) [self.nowLineView removeFromSuperview]; 
    if([timeline.date isTodayWithTimeZone:self.timeZone]){ 

     NSDate *date = [NSDate date]; 
     NSDateComponents *comp = [date dateComponentsWithTimeZone:self.timeZone]; 

     NSInteger hourStart = comp.hour; 
     CGFloat hourStartPosition = hourStart * VERTICAL_DIFF + VERTICAL_INSET; 

     NSInteger minuteStart = round(comp.minute/5.0) * 5; 
     CGFloat minuteStartPosition = roundf((CGFloat)minuteStart/60.0f * VERTICAL_DIFF); 

     CGRect eventFrame = CGRectMake(self.nowLineView.frame.origin.x, hourStartPosition + minuteStartPosition - 5, NOB_SIZE + self.frame.size.width - LEFT_INSET, NOB_SIZE); 
     self.nowLineView.frame = eventFrame; 
     [sv addSubview:self.nowLineView]; 

    } 

    if(!self.dataSource) return; 

    timeline.events = [NSMutableArray new]; 
    [self.dataSource calendarDayTimelineView:self eventsForDate:timeline.date andEvents:timeline.events success:^{ 
     [timeline.events sortUsingComparator:^NSComparisonResult(TKCalendarDayEventView *obj1, TKCalendarDayEventView *obj2){ 
      return [obj1.startDate compare:obj2.startDate]; 
     }]; 

     [self _realignEventsAtIndex:index]; 
     if(self.nowLineView.superview == sv) 
      [sv bringSubviewToFront:self.nowLineView]; 
    }]; 
} 

,然后改变你的eventsForDate功能看起来像这样:

- (void) calendarDayTimelineView:(TKCalendarDayView*)calendarDayTimeline eventsForDate:(NSDate *)eventDate andEvents:(NSMutableArray *)events success:(void (^)())success { 

    [Model doSomethingAsync andSuccess:^(NSArray *classes) { 

     // .. Add stuff to events.. 

     success(); 
    }]; 
} 

我假设其他控件的模式非常相似。前提是您需要继续格式化/布局流程,直到获取数据。