2010-11-15 164 views
2

編輯:我遇到的問題是,我使用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請求完成並恢復代碼?這可以通過回調或線程完成嗎?

感謝

回答

0

不幸的是,在使用TapKu日曆時,不能通過SOAP異步加載數據庫。您必須同步加載日曆,因爲數據完成加載後,它們無法刷新日曆視圖。如果你每個月有超過40條記錄,這會造成巨大的5-6秒延遲。

0

你要確實等待答案是完整的 - 回調通常是最容易。究竟如何取決於你正在使用的編程庫/語言(以上是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 - 只是等到答案完全到達。

1

不要暫時停止,睡眠或等待,而是簡單地退出/退出/從當前例程/函數/方法返回。

將當前的「東西」分解爲多個代碼片段,每個片段都在自己的方法中。

使用後續的方法做下一步工作,並使異步網絡/ SOAP請求的完成例程調用該方法。

基本上,你的問題是,你仍然在思考程序編碼。適當的範例是使用事件驅動編碼:讓操作系統調用你的代碼,而不是讓你的代碼調用操作系統並等待。

0

這的確是可能的,因爲在日曆視圖的例子,修改_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(); 
    }]; 
} 

我假設其他控件的模式非常相似。前提是您需要繼續格式化/佈局流程,直到獲取數據。

相關問題